const { List } = require('immutable-ext');

const Right = x => ({
chain : f => f(x),
ap : other => other.map(x),
traverse : (of, f) => f(x).map(Right),
map : f => Right(f(x)),
fold : (f, g) => g(x),
concat : o => o.fold(_ => Right(x), y => Right(x.concat(y))),
toString : () => `Right(${x})`
}) const Left = x => ({
chain : f => Left(x),
ap : other => Left(x),
traverse : (of, f) => of(Left(x)),
map : f => Left(x),
fold : (f, g) => f(x),
concat : o => o.fold(_ => Left(x), y => o),
toString : () => `Left(${x})`
}); const fromNullable = x => x != null ?
Right(x) :
Left(null); const tryCatch = f => {
try {
return Right(f())
}
catch( e ) {
return Left(e)
}
}; let stats = List.of({
page : 'Home',
view :
}, {
page : 'About',
view :
}, {
page : 'Help',
view :
}); const Sum = x => ({
x,
concat : ({ x: y }) => Sum(x + y),
toString : () => `Sum(${x})`
});
Sum.empty = () => Sum(); const res = stats.foldMap(x => fromNullable(x.view)
.map(Sum), Right(Sum()));
console.log(res.toString()); // Right(Sum(54))

If change the data a litte bit:

let stats = List.of({
page : 'Home',
view :
}, {
page : 'About',
view :
}, {
page : 'Help',
view : null
}); const Sum = x => ({
x,
concat : ({ x: y }) => Sum(x + y),
toString : () => `Sum(${x})`
});
Sum.empty = () => Sum(); const res = stats.foldMap(x => fromNullable(x.view)
.map(Sum), Right(Sum()));
console.log(res.toString()); // Right(Sum(50))

Because the view: null, then it will skip .map(sum).

最新文章

  1. CS193P学习笔记(一)
  2. Axis2 webservice入门--写个简单的webservice
  3. 3640: JC的小苹果 - BZOJ
  4. android UI进阶之实现listview的下拉加载
  5. 关于C#虚函数和构造函数的一点理解
  6. Codeforces 163A Substring and Subsequence
  7. php之手机号码查归属地
  8. pyqt tabWidget例子学习1
  9. python之log
  10. IDEA调用其它模块module的类方法
  11. Linux网络编程目录
  12. IEnumerable 与 IEnumerable<T>
  13. webpack常用loader和plugin及打包速度优化
  14. python内置函数整理
  15. phpmyadmin无法访问503错误的解决方法
  16. php基础-5
  17. MySQL查询数据表的Auto_Increment(自增id)
  18. python学习笔记(十一)之序列
  19. Codeforces Round #114 (Div. 1) E. Wizards and Bets 高斯消元
  20. 源码安装redis初始化实例脚本

热门文章

  1. mysql 批量删除数据
  2. 字符设备驱动-----Linux中断处理体系结构
  3. vue踩坑记-在项目中安装依赖模块npm install报错
  4. 处理async void 方法中无法捕捉异常信息
  5. Objc执行时读取和写入plist文件遇到的问题
  6. dot 语法全介绍
  7. 含有打印、统计DataGridView(1)
  8. CodeVs——T 4919 线段树练习4
  9. 使用Maven构建eclipse项目 (以zorka为例)
  10. uvaoj-1595:symmetry