지난 몇년동안 함수형 코딩은 꽤나 유행이였습니다.
함수형코딩은 세부적인 코드의 간결함을 만들어줬기 때문입니다.
물론 함수형 코딩의 유행은 몇년의 주기를 가지고 지속적으로 생기긴합니다.
이러한 함수형 코딩의 유행에 따라 다양한 라이브러리가 나오기 시작했습니다.
제가 느끼기에는 FxTs의 경우 generator를 이용하여 지연 평가를 만들어놓은 툴킷에 불과했습니다.
물론 이러한 툴킷들은 선언형 프로그래밍에 대해서 도움을 주는건 맞습니다.
하지만 저희가 찾는 함수형은 그런 것이 아닌, 사상과 대응 그리고 모나드, 더 많은 모나드였습니다.
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가 되어야만 했습니다.
물론 Entry Point로 사용되는 함수는 좀 있긴합니다만, 그건 너무 섹시하지못합니다.
아무튼 이러한 Effect의 형태와 깔끔함은 프레임워크로써의 역할을 하며, Node 업계에 새로운 바람과 표준을 보여주지않을까 필자는 기대하고 있습니다.