import * as AsyncData from "@typed/async-data" import { Effect, flow, Layer, Match, Option } from "effect" import { QueryState } from "./internal/index.js" export class QueryProgress extends Effect.Tag("@reffuse/extension-query/QueryProgress")> readonly update: ( f: (previous: Option.Option) => AsyncData.Progress ) => Effect.Effect }>() { static readonly Live: Layer.Layer< QueryProgress, never, QueryState.QueryState > = Layer.effect(this, Effect.gen(function*() { const state = yield* QueryState.makeTag() const get = state.get.pipe( Effect.map(flow(Match.value, Match.tag("Loading", v => v.progress), Match.tag("Refreshing", v => v.progress), Match.orElse(() => Option.none()), )) ) const update = (f: (previous: Option.Option) => AsyncData.Progress) => get.pipe( Effect.map(f), Effect.flatMap(progress => state.update(previous => AsyncData.updateProgress(previous, progress) )), ) return { get, update } })) }