type ArrayOr = T | T[]; type PromiseOr = T | Promise; type Subscriber = (...params: T) => void; type SubscribeFunction = (listeners: ArrayOr>) => () => void; type NotifyFunction = (...value: T) => void; interface SubscribableOptions { maxListeners?: number; } interface Subscribable { subscribe: SubscribeFunction; } interface Notifiable { notify: NotifyFunction; } interface StoreOptions extends SubscribableOptions { immediatelyNotify?: boolean; } interface StoreMethods { get(): T; set(value: T): void; set(updater: UpdateFunction): Promise; patch(value: Partial): void; patch(patcher: PatchFunction): Promise; } type UpdateFunction = (value: T) => PromiseOr; type PatchFunction = (value: T) => PromiseOr>; type StoreSubscriber = (newValue: T, oldValue?: T) => void; type StoreSubscribeFunction = SubscribeFunction<[ newValue: T, oldValue?: T ]>; type StoreGetter = StoreMethods["get"]; type StoreSetter = StoreMethods["set"]; type StorePatcher = StoreMethods["patch"]; interface Destroyable { destroy(): void; } interface ReadonlyStore { get: StoreGetter; subscribe: StoreSubscribeFunction; } interface PatchableStore { patch: StorePatcher; } interface WritableStore { set: StoreSetter; } interface AccessibleStore { get value(): T; set value(val: T); } type StoreValues[] | ReadonlyArray>> = T extends [ReadonlyStore] ? [T0] : T extends [ReadonlyStore, ReadonlyStore] ? [T0, T1] : T extends [ ReadonlyStore, ReadonlyStore, ReadonlyStore ] ? [T0, T1, T2] : T extends [ ReadonlyStore, ReadonlyStore, ReadonlyStore, ReadonlyStore ] ? [T0, T1, T2, T3] : T extends [ ReadonlyStore, ReadonlyStore, ReadonlyStore, ReadonlyStore, ReadonlyStore ] ? [T0, T1, T2, T3, T4] : T extends [ ReadonlyStore, ReadonlyStore, ReadonlyStore, ReadonlyStore, ReadonlyStore, ReadonlyStore ] ? [T0, T1, T2, T3, T4, T5] : T extends [ ReadonlyStore, ReadonlyStore, ReadonlyStore, ReadonlyStore, ReadonlyStore, ReadonlyStore, ReadonlyStore ] ? [T0, T1, T2, T3, T4, T5, T6] : T extends [ ReadonlyStore, ReadonlyStore, ReadonlyStore, ReadonlyStore, ReadonlyStore, ReadonlyStore, ReadonlyStore, ReadonlyStore ] ? [T0, T1, T2, T3, T4, T5, T6, T7] : T extends [ ReadonlyStore, ReadonlyStore, ReadonlyStore, ReadonlyStore, ReadonlyStore, ReadonlyStore, ReadonlyStore, ReadonlyStore, ReadonlyStore ] ? [T0, T1, T2, T3, T4, T5, T6, T7, T8] : { [Key in keyof T]: T[Key] extends ReadonlyStore ? V : never; }; declare function createAccessors(obj: Val, get: StoreGetter, set: StoreSetter): Val & AccessibleStore; declare function createGetSet(initial: T, notify: NotifyFunction<[newVal: T, oldVal?: T]>): [get: StoreGetter, set: StoreSetter]; declare function createPatch(get: StoreGetter, set: StoreSetter): StorePatcher; declare function createStoreSubscribe(sub: SubscribeFunction<[newValue: T, oldValue?: T]>, get: StoreGetter, immediatelyNotify?: boolean): SubscribeFunction<[newValue: T, oldValue?: T]>; declare function createStore(initialValue: T, { maxListeners, immediatelyNotify }?: StoreOptions): ReadonlyStore & PatchableStore & WritableStore & AccessibleStore; declare function createSubscribable({ maxListeners, }?: SubscribableOptions): Subscribable & Notifiable; declare function deriveStore[] | ReadonlyArray>, R>(stores: T, handler: (...values: StoreValues) => R, initial?: R, options?: StoreOptions): ReadonlyStore & Destroyable; declare function deriveStore[] | ReadonlyArray>, R>(stores: T, handler: (...values: StoreValues) => Promise, initial: R, options?: StoreOptions): ReadonlyStore & Destroyable; export { AccessibleStore, ArrayOr, Destroyable, Notifiable, NotifyFunction, PatchFunction, PatchableStore, PromiseOr, ReadonlyStore, StoreGetter, StoreMethods, StoreOptions, StorePatcher, StoreSetter, StoreSubscribeFunction, StoreSubscriber, StoreValues, Subscribable, SubscribableOptions, SubscribeFunction, Subscriber, UpdateFunction, WritableStore, createAccessors, createGetSet, createPatch, createStore, createStoreSubscribe, createSubscribable, createStore as default, deriveStore };