import type * as AsyncData from "@typed/async-data" import { Context, Effect, Layer } from "effect" export interface QueryState { readonly get: Effect.Effect> readonly set: (value: AsyncData.AsyncData) => Effect.Effect readonly update: (f: (previous: AsyncData.AsyncData) => AsyncData.AsyncData) => Effect.Effect } export const makeTag = (): Context.Tag, QueryState> => Context.GenericTag("@reffuse/query-extension/QueryState") export const layer = ( tag: Context.Tag, QueryState>, get: Effect.Effect>, set: (value: AsyncData.AsyncData) => Effect.Effect, ): Layer.Layer> => Layer.succeed(tag, { get, set, update: f => get.pipe( Effect.map(f), Effect.flatMap(set), ), })