UNPKG

@pixelation/state

Version:

Composable, reactive state management.

57 lines (56 loc) 3.7 kB
export type Primitive = string | number | boolean | null | undefined | object | Array<Primitive>; export type AnyFunction = (...args: any[]) => any; export type AtomBase = { id: number; children: Set<AnyAtom>; parents: Set<AnyAtom>; }; export type ReadAtom<Value> = AtomBase & { value: Value; }; export type DynamicReadAtom<Value> = AtomBase & { value: Value; read: (get: AtomGet) => Value; }; export type DynamicReadWriteAtom<ReadValue, WriteValue, Args extends Array<unknown>> = AtomBase & { value: ReadValue; read: (get: AtomGet) => ReadValue; write: (get: AtomGet, set: AtomSet, ...args: Args) => WriteValue; }; export type ReadWriteAtom<ReadValue, WriteValue, Args extends Array<unknown>> = AtomBase & { value: ReadValue; write: (get: AtomGet, set: AtomSet, ...args: Args) => WriteValue; }; export type Atom<ReadValue, WriteValue, Args extends Array<unknown> = []> = ReadAtom<ReadValue> | ReadWriteAtom<ReadValue, WriteValue, Args> | DynamicReadAtom<ReadValue> | DynamicReadWriteAtom<ReadValue, WriteValue, Args>; export type AnyAtom = Atom<any, any, any>; export type AnyReadAtom = ReadAtom<any>; export type AnyReadWriteAtom = ReadWriteAtom<any, any, any>; export type AtomReadValue<A> = A extends Atom<infer ReadValue, infer _WriteValue> ? ReadValue : never; export type AtomWriteValue<A> = A extends Atom<infer _ReadValue, infer WriteValue> ? WriteValue : never; export type AtomGet = <A>(atom: A) => A extends Atom<infer ReadValue, infer _WriteValue> ? ReadValue : never; export type DynamicReader = <Value>(get: AtomGet) => Value; export type AtomSet = { <ReadValue, A extends ReadAtom<ReadValue>>(atom: A, value: ReadValue): void; <ReadValue, WriteValue, Args extends Array<unknown>, A extends DynamicReadWriteAtom<ReadValue, WriteValue, Args>>(atom: A, ...args: A extends ReadWriteAtom<infer _ReadValue, infer _WriteValue, infer Args> ? Args : never): A extends DynamicReadWriteAtom<infer _ReadValue, infer WriteValue, infer _Args> ? WriteValue : never; <ReadValue, WriteValue, Args extends Array<unknown>, A extends ReadWriteAtom<ReadValue, WriteValue, Args>>(atom: A, ...args: A extends ReadWriteAtom<infer _ReadValue, infer _WriteValue, infer _Args> ? Args : never): A extends ReadWriteAtom<infer _ReadValue, infer WriteValue, infer _Args> ? WriteValue : never; }; export type AtomWriter = <Value, Args extends Array<unknown>>(get: AtomGet, set: AtomSet, ...args: Args) => Value; export type AtomFactory = { <Reader extends (get: AtomGet) => any>(reader: Reader): Reader extends (get: AtomGet) => infer Value ? DynamicReadAtom<Value> : never; <Reader extends (get: AtomGet) => any, Writer extends (get: AtomGet, set: AtomSet, ...args: Array<any>) => any>(reader: Reader, writer: Writer): Reader extends (get: AtomGet) => infer ReadValue ? Writer extends (get: AtomGet, set: AtomSet, ...args: infer Args) => infer Resolved ? DynamicReadWriteAtom<ReadValue, Resolved, Args> : never : never; <ReadValue, Writer extends (get: AtomGet, set: AtomSet, ...args: Array<any>) => any>(reader: ReadValue, writer: Writer): ReadValue extends Primitive ? Writer extends (get: AtomGet, set: AtomSet, ...args: infer Args) => infer Resolved ? ReadWriteAtom<ReadValue, Resolved, Args> : never : never; <Value>(reader: Value): Value extends Primitive ? ReadAtom<Value> : never; }; export declare class Store { id: number; queue: Array<AnyAtom>; atom: AtomFactory; get: AtomGet; set: AtomSet; update: () => void; } export declare const ROOT_STORE: Store; export declare const atom: AtomFactory; export declare const get: AtomGet; export declare const set: AtomSet; export declare const update: () => void;