Однако существует шаблон, который допускает такое завершение:
input.pipe(up(), up(), left());
Делая функции автономными и «обвязывая» их, вы знаете, что цепочка заканчивается внутри pipe
(обратите внимание, что они должныбыть функциями высшего порядка).Этот шаблон используется, например, rxjs, хотя там они вообще не заботятся о прекращении цепочки.Причина, по которой это делается там (что тоже хорошо), заключается в том, что она дает вам легко расширяемую систему операторов, которая может быть потрясена деревом.
Точно так же вы можете вернуться к точечной цепочке (если вы действительно этого хотите)), просто обернув цепочку:
input.chain(chain => chain.left().up());
Метод chain
может запустить предоставленную ему функцию и знает, что в конце этого цепочка завершается.Таким образом, предполагая, что ваши функции возвращают объект с помощью метода value
, pipe
/ chain
может просто неявно вызвать его в конце:
chain(chainer: (obj: MyObj) => MyObj) {
return chainer(this).value();
}
Конечно, по сути это переносит бремя вызоваvalue
в конце к вызову цепочки в начале.
Еще одно замечание: я бы, вероятно, не реализовал этот класс, чтобы иметь это изменяемое состояние, но, если вы используете цепочку, вместо этого идите по пути использования неизменяемого объекта и каждый такой оператор возвращает новый объект.,Это делает поведение цепочки более предсказуемым и разумным, так как вы не рискуете применить последовательность цепочек дважды и т. Д.