import { Signal } from '../core/signal'; export interface Comparator { (prev: T, next: T): boolean; } export interface Selector { (state: T): U; } export interface Middleware { (newState: T, state: Partial, store: IStore): void; } export interface StoreOptions { } export interface IStore { getState(): T; setState(newStateOrSetter: Partial | ((state: T) => Partial)): void; select(selector: Selector, comparator?: Comparator): Signal; subscribe(selector: Selector, listener: (value: U) => void, comparator?: Comparator): void; notify(): void; } export type InferStoreType = T extends IStore ? U : never; type FunctionProperties = { [K in keyof T as T[K] extends (...args: any[]) => any ? K : never]: T[K]; }; export type StoreWithFunctions = IStore & FunctionProperties; export {};