Среди функциональных библиотек fp-ts, фокусирующаяся на функциональных отображениях и монадах, пользовалась большой популярностью. Однако, с интеграцией в Effect, она трансформировалась в фреймворк.
В отличие от традиционных библиотек, Effect функционирует как фреймворк. Для использования объектов Effect необходимы соответствующие знания.
Effect использует объекты, обернутые в Effect, подобно Observable в RxJs, и, как ожидается, имеет потенциал для установления нового стандарта в сообществе Node.js.
В последние несколько лет функциональное программирование стало довольно популярным.
Если объектно-ориентированное программирование создает структуры,
то функциональное программирование обеспечило краткость и ясность кода на более детальном уровне.
Конечно, популярность функционального программирования циклична и повторяется с определенной периодичностью.
Вслед за этой тенденцией стали появляться различные библиотеки.
На мой взгляд, FxTsпредставлял собой всего лишь набор инструментов, использующих генераторы для ленивой оценки.
lodash также производил впечатление набора инструментов.
Конечно, эти наборы инструментов помогают в декларативном программировании.
Но нам нужно было нечто большее, чем просто наборы инструментов, — нам нужны были отображения, соответствия, монады и еще больше монад.
fp-tsсоответствовал этим требованиям, а его разработчик был истинным приверженцем функционального программирования.
Однако несколько месяцев назад я узнал, что эта библиотекаEffectбыла объединена с другой.
Поэтому я решил изучить Effect, и там я обнаружил кое-что новое.
Если раньше fp-tsбыла больше похожа на библиотеку, то Effectскорее напоминает фреймворк.
Для использования Effectнеобходимо обладать базовыми знаниями о нем.
NestJs и NextJsтребуют аналогичного понимания для их использования.
Библиотеку можно просто взять и использовать, если ее API хорошо документирован, но фреймворк требует понимания его структуры и принципов работы.
import{Effect,Console}from"effect"let i =1const expensiveTask =Effect.promise(()=>{console.log("expensive task...")returnnewPromise((resolve)=>{setTimeout(()=>{resolve(result ${i++})},100)});})const program =Effect.gen(function*(){console.log("non-cached version:")yield* expensiveTask.pipe(Effect.andThen(Console.log))yield* expensiveTask.pipe(Effect.andThen(Console.log))console.log("cached version:")const cached =yield*Effect.cached(expensiveTask)yield* cached.pipe(Effect.andThen(Console.log))yield* cached.pipe(Effect.andThen(Console.log))})Effect.runFork(program)/*
Output:
non-cached version:
expensive task...
result 1
expensive task...
result 2
cached version:
expensive task...
result 3
result 3
*/
В Effectобъекты вместо обертывания в Observable, как в RxJs, обертываются в Effect, и эти объекты передаются далее,
словно async — заражая всё вокруг.
Для работы с объектами Effectфункции, которые их используют, также должны быть Effect.
Как, например, в случае с programв приведенном выше коде.
Конечно, есть функции, которые используются в качестве начальной точки, но они не настолько элегантны.
В любом случае, структура и чистота Effectкак фреймворка, привносят новые идеи и стандарты в мир Node.js, и я надеюсь, что он принесет перемены в эту сферу.