import type { Effect, Stream } from "effect" import { ReffuseExtension, type ReffuseNamespace } from "reffuse" import * as MutationRunner from "./MutationRunner.js" import * as QueryClient from "./QueryClient.js" import type * as QueryProgress from "./QueryProgress.js" import * as QueryRunner from "./QueryRunner.js" export interface UseQueryProps { readonly key: Stream.Stream readonly query: (key: K) => Effect.Effect readonly options?: QueryRunner.RunOptions } export interface UseMutationProps { readonly mutation: (key: K) => Effect.Effect } export const QueryExtension = ReffuseExtension.make(() => ({ useQuery< QK extends readonly unknown[], QA, FallbackA, QE, HandledE, QR extends R, R, >( this: ReffuseNamespace.ReffuseNamespace>, props: UseQueryProps, ): QueryRunner.QueryRunner> { const runner = this.useMemo(() => QueryRunner.make({ QueryClient: QueryClient.makeGenericTagClass(), key: props.key, query: props.query, }), [props.key]) this.useFork(() => QueryRunner.run(runner, props.options), [runner]) return runner }, useMutation< QK extends readonly unknown[], QA, FallbackA, QE, HandledE, QR extends R, R, >( this: ReffuseNamespace.ReffuseNamespace>, props: UseMutationProps, ): MutationRunner.MutationRunner> { return this.useMemo(() => MutationRunner.make({ QueryClient: QueryClient.makeGenericTagClass(), mutation: props.mutation, }), []) }, }))