import { Sum } from "../../main"; import { replaceWith } from "../fun/domains/updater/domains/replaceWith/state"; import { BasicUpdater, Updater } from "../fun/domains/updater/state"; export type DirtyStatus = "dirty" | "not dirty" | "dirty but being processed"; export type DebouncedStatus = | "waiting for dirty" | "just detected dirty, starting processing" | "processing finished" | "state was still dirty but being processed, resetting to not dirty" | "processing shortcircuited" | "state was changed underwater back to dirty, leaving the dirty flag alone" | "inner call failed with transient failure"; export type Debounced = Value & { lastUpdated: number; dirty: DirtyStatus; status: Sum; }; export const Debounced = { Default: (initialValue: v, debug?: boolean): Debounced => ({ ...initialValue, lastUpdated: 0, dirty: "not dirty", status: debug ? Sum.Default.left("waiting for dirty") : Sum.Default.right("debug off"), }), Updaters: { Core: { status: (_: BasicUpdater): Updater> => Updater>((current) => ({ ...current, status: current.status.kind == "l" ? Sum.Default.left(_(current.status.value)) : Sum.Default.right("debug off"), })), dirty: (_: BasicUpdater): Updater> => Updater>((current) => ({ ...current, dirty: _(current.dirty), })), lastUpdated: (_: BasicUpdater): Updater> => Updater>((current) => ({ ...current, lastUpdated: _(current.lastUpdated), })), valueWithoutDebouncing: (_: BasicUpdater): Updater> => Updater>((current) => ({ ...current, ..._(current), })), value: (_: BasicUpdater): Updater> => Updater>((current) => ({ ..._(current), dirty: current.dirty, lastUpdated: current.lastUpdated, status: current.status, })), }, Template: { value: (_: BasicUpdater): Updater> => // Debounced.Updaters.Core.value(_).then( // Debounced.Updaters.Core.dirty(replaceWith("dirty")) // ).then( // Debounced.Updaters.Core.lastUpdated(replaceWith(Date.now())) // ) Updater>((current) => ({ ..._(current), dirty: "dirty", lastUpdated: Date.now(), status: current.status, })), }, }, Operations: { shouldCoroutineRun: (_: Debounced) => _.dirty != "not dirty", }, };