import { Draft, Draft as Draft$1, WritableDraft, nothing, nothing as nothing$1 } from "immer"; import * as type_plus0 from "type-plus"; import { AnyFunction, KeyTypes, RecordValue, UnionOfValues, Widen } from "type-plus"; import * as _just_web_app0 from "@just-web/app"; import { LogGizmo, Logger, define } from "@just-web/app"; //#region src/types.d.ts /** * Updater for type `T`. * * If the function does not return, * or the resulting promise does not resolve to a value, * the value is assumed to be updated in-place. * * If the function returns `nothing` or resolves to `nothing`, * the value will be cleared. */ type Updater = (draft: Draft) => UpdaterResult | Promise>; /** * The result of an updater function. * * If the updater returns `nothing` or resolves to `nothing`, * the value will be cleared. * * If the updater returns a promise that resolves to `nothing`, * the value will be cleared. * * If the updater returns a promise that resolves to a value, the value will be set to the resolved value. * * The return type cannot narrow to `typeof nothing` due to the limitation of TypeScript. * Need to use `symbol` instead. */ type UpdaterResult = undefined extends T$1 ? Exclude | void | symbol : T$1 | symbol | void; //#endregion //#region src/state.d.ts type SetStateValue = T$1 | Updater; /** * set or update the state. */ type SetState = = SetStateValue>(value: V) => V extends AnyFunction> ? Promise : T$1; type StateChangeHandler = (value: T$1, prev: T$1) => void; type OnStateChange = (handler: StateChangeHandler) => () => void; type ResetState = () => void; type StateMeta = { logger?: Logger; }; /** * creates a functional style state to track changes of a value. * * @param init initial value T * @param meta optional meta data for custom logger. * @returns [value: T, set: SetState, onChange: OnStateChange, reset: ResetState] * * @example * ```ts * const [value, set, onChange, reset] = app.states.createState(0) * * value // 0 * set(1) // value: 1 * onChange(v => console.log(v)) // trigger when set * reset() // reset value to the initial value * ``` */ declare function createState(init: T$1, meta?: StateMeta): [value: T$1, set: SetState, onChange: OnStateChange, reset: ResetState]; //#endregion //#region src/registry.d.ts type ReadonlyRegistry = { get(): Record; onChange: OnStateChange>; keys(): K$1[]; has(key: K$1): boolean; size(): number; values(): T$1[]; }; type Registry = ReadonlyRegistry & { set: SetState>; reset: ResetState; }; /** * Gets the Value type of the Registry (the `Record`) */ type RegistryValue> = ReturnType; declare function createRegistry(init?: Record, meta?: StateMeta): Registry, T$1>; declare function toReadonlyRegistry>(registry: S): S extends Registry ? ReadonlyRegistry : never; //#endregion //#region src/store.d.ts type ReadonlyStore = { get(): T$1; onChange: OnStateChange; }; /** * A store tracks a value and its changes. */ type Store = ReadonlyStore & { set: SetState; reset: ResetState; }; /** * The Store Value type. */ type StoreValue> = ReturnType; /** * creates a object style store to track a value and its changes. * * @param init initial value T * @param meta optional meta data for custom logger. * @returns { get, set, update, onChange, reset } * * @example * ```ts * const store = app.states.createStore(0) * * store.get() // 0 * store.set(1) // 1 * store.update(v => v + 1) // 2 * store.onChange(v => console.log(v)) // trigger when set or update * store.reset() // reset value to the initial value * ``` */ declare function createStore(value: T$1, meta?: StateMeta): Store; /** * Convert a store to a readonly store. */ declare function toReadonlyStore>(store: S): S extends Store ? ReadonlyStore : never; //#endregion //#region src/adder.d.ts type Adder = (...entries: T$1[]) => void; type WithAdder = { add: Adder; }; /** * builds an adder function for a store or registry */ declare function adder>(registry: R, handler: (record: Draft$1>, entry: RecordValue>) => void): Adder>>>; declare function adder, S extends Store>(store: S, handler: (record: Draft$1, entry: UnionOfValues) => void): Adder>; declare function adder>>(store: S, handler: (record: Draft$1>, entry: RecordValue>) => void): Adder>>; declare function withAdder>(registry: R, addEntry: (record: Draft$1>, entry: RecordValue>) => void): R & WithAdder>>; declare function withAdder, S extends Store>(store: S, addEntry: (record: Draft$1, entry: ReturnType) => void): S & WithAdder>>; declare function withAdder>>(store: S, addEntry: (record: Draft$1>, entry: RecordValue>) => void): S & WithAdder>>; declare function push>(record: Draft$1, entry: UnionOfValues): void; declare function unshift>(record: Draft$1, entry: UnionOfValues): void; //#endregion //#region src/is_nothing.d.ts declare function isNothing(value: unknown): value is typeof nothing$1; //#endregion //#region src/states_gizmo.d.ts /** * A gizmo that provides states functionalities. * * It uses `immer` internally to perform state updates. * * @require LogGizmo * * @example * ```ts * const app = await justApp().with(statesGizmo).create() * * app.states.createState(0) * app.states.createStore(0) * app.states.createRegistry() * ``` */ declare const statesGizmo: _just_web_app0.GizmoStatic<_just_web_app0.DepBuilder, { states: { /** * creates a functional style state to track changes of a value. * * By default it will use the app logger. * * @param init initial value T * @param meta optional meta data for custom logger. * @returns [value: T, set: SetState, onChange: OnStateChange, reset: ResetState] * * @example * ```ts * const [value, set, onChange, reset] = app.states.createState(0) * * value // 0 * set(1) // value: 1 * onChange(v => console.log(v)) // trigger when set * reset() // reset value to the initial value * ``` */ createState(init: T$1, meta?: StateMeta): [value: T$1, set: SetState, onChange: OnStateChange, reset: ResetState]; /** * creates a object style store to track a value and its changes. * * By default it will use the app logger. * * @param init initial value T * @param meta optional meta data for custom logger. * @returns { get, set, update, onChange, reset } * * @example * ```ts * const store = app.states.createStore(0) * * store.get() // 0 * store.set(1) // 1 * store.update(v => v + 1) // 2 * store.onChange(v => console.log(v)) // trigger when set or update * store.reset() // reset value to the initial value * ``` */ createStore(init: T$1, meta?: StateMeta): Store; /** * Creates a registry to track a record and its changes. * A registry is similar to a `store` but specialized for records. * * It provides additional methods such as `keys()` and `has()`. * * By default it will use the app logger. * * @param init optional initial value T * @param meta optional meta data for custom logger. * @returns { get, set, update, onChange, reset } * * @example * ```ts * const registry = app.states.createRegistry() * * registry.update(v => { v.x = 1 }) * registry.keys() // ['x'] * registry.has('x') // true * registry.size() // 1 * registry.values() // [1] * ``` */ createRegistry(init?: Record, meta?: StateMeta): Registry, T$1>; }; }>; /** * A gizmo that provides states functionalities. */ type StatesGizmo = define.Infer; //#endregion export { Adder, type Draft, OnStateChange, ReadonlyRegistry, ReadonlyStore, Registry, RegistryValue, ResetState, SetState, SetStateValue, StateChangeHandler, StateMeta, StatesGizmo, Store, StoreValue, type Updater, type UpdaterResult, WithAdder, type WritableDraft, adder, createRegistry, createState, createStore, isNothing, nothing, push, statesGizmo, toReadonlyRegistry, toReadonlyStore, unshift, withAdder }; //# sourceMappingURL=index.d.cts.map