repos / starfx

a micro-mvc framework for react apps
git clone https://github.com/neurosnap/starfx.git

starfx / src / store / slice
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}