码迷,mamicode.com
首页 > 其他好文 > 详细

[Functional Programming] Reader with Async ADT

时间:2019-05-31 23:33:10      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:variable   provides   rod   sign   ogr   tar   const   output   json   

ReaderT is a Monad Transformer that wraps a given Monad with a Reader. This allows the interface of a Reader that enables the composition of computations that depend on a shared environment (e -> a), but provides a way to abstract a means the Reader portion, when combining ReaderTs of the same type. All ReaderTs must provide the constructor of the target Monad that is being wrapped.

 

The task we want to do is read from a "data.json" file:

{
  "name": "App",
  "config": {
    "prod": "config.prod.json",
    "dev": "config.dev.json",
    "test": "config.test.json"
  }
}

 

According to the ‘env‘ variable we pass in, it will pick different config file:

config.test.json:

{
  "port": 5200
}

 

In the end, it will output a json file combine the result.

 

const { readJSON, writeJSON, fork } = require("./helper");
const {
  Async,
  ReaderT,
  omit,
  pipeK,
  assign
} = require("crocks");

const ReaderAsync = ReaderT(Async);
const env = {
  input: "data.json",
  output: "output.json"
};

const input = env =>
  ReaderAsync(({ input }) => readJSON(input).map(assign({ env })));
const config = data =>
  ReaderAsync(() =>
    readJSON(data.config[data.env])
      .map(assign(data))
      .map(omit(["config"]))
  );
const output = inputData =>
  ReaderAsync(({ output }) => writeJSON(output, inputData));
const flow = pipeK(
  ReaderAsync.of,
  input,
  config,
  output
);

fork(flow("test").runWith(env));

  

output.json file:

{
  "port": 5200,
  "name": "App",
  "env": "test"
}

 

[Functional Programming] Reader with Async ADT

标签:variable   provides   rod   sign   ogr   tar   const   output   json   

原文地址:https://www.cnblogs.com/Answer1215/p/10957781.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!