diff --git a/packages/effect-fc/src/Query.ts b/packages/effect-fc/src/Query.ts new file mode 100644 index 0000000..8c549b8 --- /dev/null +++ b/packages/effect-fc/src/Query.ts @@ -0,0 +1,29 @@ +import { type Effect, Pipeable, Predicate, type Stream } from "effect" + + +export const QueryTypeId: unique symbol = Symbol.for("@effect-fc/Query/Query") +export type QueryTypeId = typeof QueryTypeId + +export interface Query +extends Pipeable.Pipeable { + readonly [QueryTypeId]: QueryTypeId + + readonly key: Stream.Stream + readonly query: (key: K) => Effect.Effect + readonly initialProgress: P +} + +class QueryImpl +extends Pipeable.Class() implements Query { + readonly [QueryTypeId]: QueryTypeId = QueryTypeId + + constructor( + readonly key: Stream.Stream, + readonly query: (key: K) => Effect.Effect, + readonly initialProgress: P, + ) { + super() + } +} + +export const isQuery = (u: unknown): u is Query => Predicate.hasProperty(u, QueryTypeId) diff --git a/packages/effect-fc/src/index.ts b/packages/effect-fc/src/index.ts index 08e0b73..18468a4 100644 --- a/packages/effect-fc/src/index.ts +++ b/packages/effect-fc/src/index.ts @@ -5,6 +5,7 @@ export * as Form from "./Form.js" export * as Memoized from "./Memoized.js" export * as PropertyPath from "./PropertyPath.js" export * as PubSub from "./PubSub.js" +export * as Query from "./Query.js" export * as ReactRuntime from "./ReactRuntime.js" export * as Result from "./Result.js" export * as SetStateAction from "./SetStateAction.js"