ここ数年、関数型プログラミングはかなりの流行でした。
関数型プログラミングは詳細なコードの簡潔性をもたらしてくれたからです。
もちろん、関数型プログラミングの流行は、数年という周期で継続的に発生します。
このような関数型プログラミングの流行に伴い、様々なライブラリが登場し始めました。
私の感覚では、FxTsの場合、ジェネレーターを使用して遅延評価を作成したツールキットに過ぎませんでした。
もちろん、これらのツールキットは、宣言型プログラミングに役立つのは事実です。
しかし、私たちが求める関数型とは、そのようなものではなく、写像と対応、そしてモナド、さらに多くのモナドでした。
fp-tsがその要件に合致し、そのメインテナーも関数型に本気でした。
しかし、数ヶ月前、そのライブラリがEffectにマージされたという知らせを受けました。
そこで、Effectを確認してみたところ、何か違っていました。
ライブラリはAPIが適切に公開されていれば、使用すればそれで済みますが、フレームワークは、そのパッケージについて理解しておく必要があります。
import { Effect, Console } from "effect"
let i = 1
const expensiveTask = Effect.promise(() => {
console.log("expensive task...")
return new Promise((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は、RxJsのようにObservableでラップされているのではなく、Effectでラップされたオブジェクトが行き来し、
まるでasync キーワードのように感染を広げていきました。
Effect オブジェクトを使用するには、そのオブジェクトを使用する関数もEffectでなければなりませんでした。
もちろん、エントリポイントとして使用される関数はいくつかありますが、それはあまりセクシーではありません。
とにかく、このようなEffectの形態と美しさは、フレームワークとしての役割を果たし、Node界に新たな風と標準を示してくれるのではないかと、筆者は期待しています。