Стиль pointfree для условной функции
Я хотел бы получить некоторую помощь в написании этого в стиле pointfree.
Для контекста: функция принимает массив типов Either и возвращает тип Task. Тип задачи отклоняется с любым из типов Either, для которых задан левый набор. Тип задачи разрешается, если нет ни одного из типов с левым набором. Это используется следующим образом:
Async.parallel(xs).
map(eachToEither).
chain(rejectAnyLefts).
fork(error, success)
Где на практике я бы добавил еще одну цепочку (непосредственно перед развилкой) для выполнения perist. Но сначала я хочу убедиться, что мой код настолько идиматичен, насколько это возможно. Функция под рукой - это rejectAnyLefts, которую я хотел бы написать pointfree, но есть пара вещей, которые бросают меня в цикл.
- если
- необходимость хранения значения leftObjs для использования в IF и, возможно, возвращаемого значения
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)
}
1 ответ
Если бы вы были заинтересованы только в захвате первого 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)));
Будет ли это более или менее читабельным, чем ваша существующая реализация, в значительной степени субъективно.