Entre as bibliotecas de codificação funcional, fp-ts ganhou popularidade por se concentrar em mapeamentos e monads funcionais, mas evoluiu para um framework com a integração do Effect.
Diferentemente das bibliotecas existentes, o Effect funciona como um framework, e o uso de objetos Effect requer conhecimento específico.
O Effect utiliza objetos encapsulados por Effect, similar ao Observable do RxJs, e espera-se que estabeleça um novo padrão na indústria Node.js.
Nos últimos anos, a programação funcional tem sido bastante popular.
Enquanto a programação orientada a objetos fornece a estrutura,
a programação funcional contribuiu para a simplicidade do código em detalhes.
Claro, a popularidade da programação funcional tende a ocorrer em ciclos de alguns anos.
Com essa popularização, diversas bibliotecas começaram a surgir.
Na minha opinião, FxTsera apenas um conjunto de ferramentas que utilizava geradores para criar avaliação preguiçosa.
lodash também tinha uma forte sensação de ser um conjunto de ferramentas.
É claro que esses conjuntos de ferramentas ajudam na programação declarativa.
Mas o tipo de programação funcional que estávamos procurando não era esse, mas sim mapeamentos, correspondências, monads e mais monads.
fp-ts se encaixava nessa necessidade, e o mantenedor era realmente apaixonado por programação funcional.
No entanto, há alguns meses, soube que essa biblioteca havia sido mesclada com Effect.
Então, verifiquei Effect, e algo estava diferente.
Enquanto o fp-ts era mais próximo de uma biblioteca, este Effect se assemelhava mais a uma estrutura.
Para usar Effect, era necessário ter um conhecimento básico sobre ele.
NestJs e NextJs também exigem compreensão para serem usados.
Se uma biblioteca possui uma API bem exposta, basta usá-la, mas uma estrutura exige compreensão do pacote em si.
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
*/
Este Effect utiliza objetos encapsulados em Effect em vez de Observable como em RxJs, e esses objetos se propagam,
como se fosse a palavra-chave async.
Para utilizar objetos Effect, as funções que os utilizam também devem ser Effect.
Como no caso de program no código acima.
Claro, existem algumas funções que podem ser usadas como ponto de entrada, mas não são tão elegantes.
De qualquer forma, acredito que a forma e a clareza do Effect como estrutura demonstram um novo padrão para o ecossistema Node, e espero que ele traga novos ares e padrões para a comunidade.