@pixelation/state
Version:
Composable, reactive state management.
57 lines (56 loc) • 3.7 kB
TypeScript
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;