Combiner & ReducerВ v4 добавили новые модули которые являются адаптированными
Semigroup & Monoid из fp-ts.Semigroup (Полугруппа) — это некий тип A и операция combine которая каким-то образом делает из двух экземпляров типа один. Как отражено в названии - комбинирует)
interface Combiner<A> {
combine: (self: A, that: A) => A
}
Самое интересное: подразумевается, что эта штука удовлетворяет неким законам.
// ассоциативность
(a⋅b)⋅c = a⋅(b⋅c)
Тут смысл такой что не важно в каком порядке выполняется операция комбинирования — результат будет тем же. Еще говорят, что полугруппа — это основа параллельности. Ну верно же: получается всю работу (выполнение всех операций
combine`) можно выполнить на разных исполнителях параллельно (в примере ниже `ab и `cd`)
((a⋅b)⋅c)⋅d = (a⋅b)⋅(c⋅d)
Еще одним свойством является замкнутость — то есть комбинируя значения одного типа мы не получим значение другого.
Опять же удобство в композуемости — в других модулях предоставляются функции для построения более сложных комбайнеров)))
// Option.ts
declare function makeCombinerFailFast<A>(
combiner: Combiner<A>
): Combiner<Option<A>>
const sumNum: Combiner<number> = Combiner.make((a, b) => a + b)
const sumOpt: Combiner<Option<number>> = makeCombinerFailFast(sumNum)
// sumOpt(None, None) // None
// sumOpt(None, Option(2)) // None
// sumOpt(Option(2), None) // None
// sumOpt(Option(2), Option(1)) // Option(3)
Например тут мы поднимаем более простой комбайнер в
Option и получаем новый — который объединяет непустые значения и оставляет пустые как есть.Помимо "мерджа" значений можно выбрать один из 2х элементов:
например брать только первый или только второй элемент (`Combiner.first` & `Combiner.second`) .
А если скрестить силы с модулем
Order то можно выбирать только максимальный или минимальный элементы.В общем инкапсулируя некую логику по комбинированию в такую абстракцию мы получаем доступ к богатым возможностям которые предоставляет экосистема. А соблюдение законов дает гарантии поведения.
Пока вижу мало использования внутри v4 экосистемы напрямую — возможно предполагается использовать только саму
combine функцию.Использовали ли когда-то полугруппы? Были какие-то необычные примеры использования? Как вам нейминг?)