import { Effect, Effectable, Readable, Stream, Subscribable, type SubscriptionRef } from "effect" class SubscribableImpl extends Effectable.Class implements Subscribable.Subscribable { readonly [Readable.TypeId]: Readable.TypeId = Readable.TypeId readonly [Subscribable.TypeId]: Subscribable.TypeId = Subscribable.TypeId constructor( readonly get: Effect.Effect, readonly changes: Stream.Stream, ) { super() } commit() { return this.get } } export const make = (values: { readonly get: Effect.Effect readonly changes: Stream.Stream }): Subscribable.Subscribable => new SubscribableImpl(values.get, values.changes) export const flatMapSubscriptionRef = ( ref: SubscriptionRef.SubscriptionRef, flatMap: (value: NoInfer) => Effect.Effect, ): Subscribable.Subscribable => make({ get: Effect.flatMap(ref, flatMap), get changes() { return Stream.flatMap(ref.changes, flatMap) }, })