export interface Metadata { key: string; } export type Getter = () => TValue; export type Setter = (newValue: TValue | ((value: TValue) => TValue), context?: TContext) => void; export type Unsubscriber = () => void; export type StateListener = (nextValue: TValue, prevValue: TValue) => void; export type StateSubscriber = (listener: StateListener) => Unsubscriber; export interface State { get: Getter; set: Setter; subscribe: StateSubscriber; meta: () => TMeta; } export type StateWithAction = Omit> & State; export type ActionBuilder = (set: Setter, get: Getter) => TAction; export interface StateBuilder { (): State; (initialValue: TValue): State; (initialValue: TValue, actionBuilder: null | undefined, metadata: TMeta): State; (initialValue: TValue, actionBuilder: ActionBuilder): StateWithAction; (initialValue: TValue, actionBuilder: ActionBuilder, metadata: TMeta): StateWithAction; } export interface StateBuilderWithMeta { (initialValue: TValue, actionBuilder: null | undefined, metadata: TMeta): State; (initialValue: TValue, actionBuilder: ActionBuilder, metadata: TMeta): StateWithAction; } export type SelectorListener = () => void; export type SelectorSubscriber = (listener: SelectorListener) => Unsubscriber; export interface Observable { get: Getter; subscribe: SelectorSubscriber; } export interface Selector extends Observable { meta: () => TMeta; } export type Middleware = (state: State) => Setter; export interface Plugin { (selector: Selector): void; } export type SelectorArray = Selector[]; export type SelectorValueArray = { [index in keyof TArray]: ReturnType; }; export type SelectorFunc = (...args: SelectorValueArray) => TValue; export type SelectorParams = [ ...TArray, SelectorFunc ]; export interface SelectorBuilder { (...items: SelectorParams): Selector; (...items: [...SelectorParams, TMeta]): Selector; } export interface SelectorBuilderWithMeta { (...items: [...SelectorParams, TMeta]): Selector; }