Eric Bower
·
2025-06-06
num.ts
1import type { AnyState } from "../../types.js";
2import type { BaseSchema } from "../types.js";
3
4export interface NumOutput<S extends AnyState> extends BaseSchema<number> {
5 schema: "num";
6 initialState: number;
7 set: (v: number) => (s: S) => void;
8 increment: (by?: number) => (s: S) => void;
9 decrement: (by?: number) => (s: S) => void;
10 reset: () => (s: S) => void;
11 select: (s: S) => number;
12}
13
14export function createNum<S extends AnyState = AnyState>({
15 name,
16 initialState = 0,
17}: {
18 name: keyof S;
19 initialState?: number;
20}): NumOutput<S> {
21 return {
22 name: name as string,
23 schema: "num",
24 initialState,
25 set: (value) => (state) => {
26 // deno-lint-ignore no-explicit-any
27 (state as any)[name] = value;
28 },
29 increment:
30 (by = 1) =>
31 (state) => {
32 // deno-lint-ignore no-explicit-any
33 (state as any)[name] += by;
34 },
35 decrement:
36 (by = 1) =>
37 (state) => {
38 // deno-lint-ignore no-explicit-any
39 (state as any)[name] -= by;
40 },
41 reset: () => (state) => {
42 // deno-lint-ignore no-explicit-any
43 (state as any)[name] = initialState;
44 },
45 select: (state) => {
46 // deno-lint-ignore no-explicit-any
47 return (state as any)[name];
48 },
49 };
50}
51
52export function num(initialState?: number) {
53 return (name: string) => createNum<AnyState>({ name, initialState });
54}