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) },
})