import { Effect, Equivalence, pipe, Stream, SubscriptionRef } from "effect" import * as React from "react" import { useFork } from "./useFork.js" import { useOnce } from "./useOnce.js" export const useSubscribeRefs: { []>( ...refs: Refs ): Effect.Effect<{ [K in keyof Refs]: Effect.Effect.Success }> } = Effect.fn("useSubscribeRefs")(function* []>( ...refs: Refs ) { const [reactStateValue, setReactStateValue] = React.useState(yield* useOnce(() => Effect.all(refs as readonly SubscriptionRef.SubscriptionRef[]) )) yield* useFork(() => pipe( refs.map(ref => Stream.changesWith(ref.changes, Equivalence.strict())), streams => Stream.zipLatestAll(...streams), Stream.runForEach(v => Effect.sync(() => setReactStateValue(v)) ), ), refs) return reactStateValue as any })