我希望能以无缝的方式写一些这样的帮助。
对于上下文:该函数采用Array of Either类型并返回Task类型。任何具有左侧设置的Either类型都会拒绝任务类型。如果没有左侧设置的Either类型,则解析任务类型。这是以这种方式使用的:
Async.parallel(xs).
map(eachToEither).
chain(rejectAnyLefts).
fork(error, success)
在实践中,我会添加另一个链(在fork之前)来执行perist。但首先,我想确保我的代码尽可能地具有风格。手头的函数是我想写无点的rejectAnyLefts,但是有几件事让我陷入困境。
- 如果
- 需要存储要在IF中使用的leftObjs值以及可能的返回值
const rejectAnyLefts = function(eitherArray){
const leftObjs = r.filter(r.propEq("isLeft", true), eitherArray)
const isEmpty = r.propEq('length', 0)
return (isEmpty(leftObjs)) ?
Task.rejected(leftObjs) :
Task.of(eitherArray)
}
如果您只对捕获第一个Left
值感兴趣,那么可以使用R.sequence
定义,这将把[Either a b]
转换为Either a [b]
。
R.pipe(R.sequence(Either.of), R.invoker(2, 'fold', Task.rejected, Task.of));
可以使用Validation
类型而不是Either
,它将组合所有Failure
值,但是这将需要Failure
类型中的值来实现Semigroup
以允许它们组合。
要捕获和拒绝所有Left
值,我们可以以无点形式为您现有的实现建模,例如:
R.pipe(R.partition(R.prop('isLeft')),
R.ifElse(R.pipe(R.head, R.isEmpty),
R.pipe(R.last, Task.of),
R.pipe(R.head, Task.rejected)));
这是否比现有实现更具可读性或更低可读性在很大程度上是主观的。