Effect https://effect.website/blog/effect-3.8#more-types-implement-effect. Теперь, например,
Ref, Fiber, Deferred - стали подтипами Effect.Это дало возможность работать с ними в контексте
Effect.gen бесшовно:
Effect.gen(function*() {
const ref = yield* Ref.make('val')
const refOldWay = yield* Ref.get(ref) // было
const newWay = yield* ref // хоба
})
С одной стороны стало более единообразно с совсем уж не
Effect данными - Option, Either и тд.C другой - не так самодокументировано - при чтении глазами нужно помнить, с каким типом идет работа, ведь, допустим, тех же
Ref ов существует туева хуча - ScopedRef , SyncronizedRef , SubscriptionRef.В поиске пути реализации этой фичи я изучил рантайм представление эффекта и набрел на модуль Effectable. Этот модуль как раз нужен для облегчения внедрения своих примитивов в
Effect мир. С его помощью и была имплементирована фича.Он представляет из себя набор прототипов и базовых классов.
Effect`-примитив в рантайме представляется объектом с полем _op и другими полями необходимыми для "запуска" соответствующей _op ерации - их существует некоторое количество. В качестве точки расширения выступает операция OP_COMMIT которая подразумевает наличие метода commit(): Effect.
export class MyVal
extends Effectable.Class<"val">
implements Effect.Effect<"val">
{
#val = "val" as const;
commit() {
return Effect.sync(() => this.#val);
}
}
Примерно так можно интегрировать свои структуры данных в экосистему
Как по мне - фичи крутые - как
Effectable так и экосистемная эффективизация) Что думаете об этом? Будете использовать?)