import { Effect, Equivalence, Option, Stream } from "effect" import * as React from "react" import { useFork } from "./useFork.js" export const useSubscribeStream: { ( stream: Stream.Stream ): Effect.Effect, never, R> , E, R>( stream: Stream.Stream, initialValue: A, ): Effect.Effect, never, R> } = Effect.fnUntraced(function* , E, R>( stream: Stream.Stream, initialValue?: A, ) { const [reactStateValue, setReactStateValue] = React.useState( // biome-ignore lint/correctness/useExhaustiveDependencies: no reactivity needed React.useMemo(() => initialValue ? Option.some(initialValue) : Option.none(), []) ) yield* useFork(() => Stream.runForEach( Stream.changesWith(stream, Equivalence.strict()), v => Effect.sync(() => setReactStateValue(Option.some(v))), ), [stream]) return reactStateValue as Option.Some })