28 lines
1007 B
TypeScript
28 lines
1007 B
TypeScript
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: {
|
|
<const Refs extends readonly SubscriptionRef.SubscriptionRef<any>[]>(
|
|
...refs: Refs
|
|
): Effect.Effect<{ [K in keyof Refs]: Effect.Effect.Success<Refs[K]> }>
|
|
} = Effect.fn("useSubscribeRefs")(function* <const Refs extends readonly SubscriptionRef.SubscriptionRef<any>[]>(
|
|
...refs: Refs
|
|
) {
|
|
const [reactStateValue, setReactStateValue] = React.useState(yield* useOnce(() =>
|
|
Effect.all(refs as readonly SubscriptionRef.SubscriptionRef<any>[])
|
|
))
|
|
|
|
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
|
|
})
|