UNPKG

abon

Version:

Flexible state management for React 🚀

198 lines (197 loc) • 19.1 kB
import { AbonArray } from "./abon-array"; import { AbonDeep } from "./abon-deep"; import { ChangeListener, ItemRecord, ItemRecordKey, ItemsChangeListener, UnsubscribeFn } from "./types"; /** Subscribe to and update an ordered list of identifiable objects. */ export declare class AbonItems<T extends object, I extends keyof T> extends AbonDeep<ItemRecord<T, I>> implements Pick<Array<T>, "find" | "findIndex" | "pop" | "values" | "forEach" | "map" | "indexOf" | "lastIndexOf" | "every" | "some" | "filter" | "includes" | "length"> { readonly idKey: I; ids: AbonArray<T[I]>["readonly"]; constructor(idKey: I, initial?: T[]); /** Set the items */ set(items: T[]): this; /** Update existing items */ set(current: ItemRecord<T, I>): this; /** Update existing items */ set(keys: [], value: ItemRecord<T, I>): this; /** Update an existing item */ set(id: T[I], item: T): this; /** Set a value of an existing item */ set<K extends keyof T>(id: T[I], key: K, value: T[K]): this; set<K extends keyof T>(keys: [T[I], K], value: T[K]): this; set<K1 extends keyof T, K2 extends keyof T[K1]>(id: T[I], _1: K1, _2: K2, value: T[K1][K2]): this; set<K1 extends keyof T, K2 extends keyof T[K1]>(keys: [T[I], K1, K2], value: T[K1][K2]): this; set<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2]>(id: T[I], _1: K1, _2: K2, _3: K3, value: T[K1][K2][K3]): this; set<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2]>(keys: [K1, K2, K3], value: T[K1][K2][K3]): this; set<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3]>(id: T[I], _1: K1, _2: K2, _3: K3, _4: K4, value: T[K1][K2][K3][K4]): this; set<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3]>(keys: [T[I], K1, K2, K3, K4], value: T[K1][K2][K3][K4]): this; set<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4]>(id: T[I], _1: K1, _2: K2, _3: K3, _4: K4, _5: K5, value: T[K1][K2][K3][K4][K5]): this; set<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4]>(keys: [T[I], K1, K2, K3, K4, K5], value: T[K1][K2][K3][K4][K5]): this; set<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4], K6 extends keyof T[K1][K2][K3][K4][K5]>(id: T[I], _1: K1, _2: K2, _3: K3, _4: K4, _5: K5, _6: K6, value: T[K1][K2][K3][K4][K5][K6]): this; set<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4], K6 extends keyof T[K1][K2][K3][K4][K5]>(keys: [T[I], K1, K2, K3, K4, K5, K6], value: T[K1][K2][K3][K4][K5][K6]): this; set<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4], K6 extends keyof T[K1][K2][K3][K4][K5], K7 extends keyof T[K1][K2][K3][K4][K5][K6]>(id: T[I], _1: K1, _2: K2, _3: K3, _4: K4, _5: K5, _6: K6, _7: K6, value: T[K1][K2][K3][K4][K5][K6][K7]): this; set<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4], K6 extends keyof T[K1][K2][K3][K4][K5], K7 extends keyof T[K1][K2][K3][K4][K5][K6]>(keys: [T[I], K1, K2, K3, K4, K5, K6, K7], value: T[K1][K2][K3][K4][K5][K6][K7]): this; /** Deletes items from the list and ensures the right order of remaining items */ delete(...ids: T[I][]): this; delete(...items: T[]): this; delete(...idsOrItems: (T | T[I])[]): this; /** * Appends new items to the end of the list and returns the new amonut of items. * @param items New items to append. */ push(...items: T[]): number; /** * Inserts new items at the start of the list. * @param items New items to insert at the start of the list. */ unshift(...items: T[]): number; /** * Returns the value of the first element in the array where predicate is true, and undefined * otherwise. * @param predicate find calls predicate once for each element of the array, in ascending * order, until it finds one where predicate returns true. If such an element is found, find * immediately returns that element value. Otherwise, find returns undefined. */ find<S extends T>(predicate: (this: void, value: T, index: number, obj: T[]) => value is S): S | undefined; find(predicate: (value: T, index: number, obj: T[]) => unknown): T | undefined; /** * Determines whether an array includes a certain element, returning true or false as appropriate. * @param searchElement The element to search for. */ includes(item: T): boolean; includes(id: T[I]): boolean; /** * Returns the index of the first element in the array where predicate is true, and -1 * otherwise. * @param predicate find calls predicate once for each element of the array, in ascending * order, until it finds one where predicate returns true. If such an element is found, * findIndex immediately returns that element index. Otherwise, findIndex returns -1. */ findIndex(predicate: (value: T, index: number, obj: T[]) => unknown): number; /** * Returns the index of the first occurrence of a value in an array. * @param searchElement The value to locate in the array. * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0. */ indexOf(item: T, fromIndex?: number): number; indexOf(id: T[I], fromIndex?: number): number; indexOf(thunk: T | T[I], fromIndex?: number): number; /** * Returns the index of the last occurrence of a specified value in an array. * @param searchElement The value to locate in the array. * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at the last index in the array. */ lastIndexOf(item: T, fromIndex?: number): number; lastIndexOf(id: T[I], fromIndex?: number): number; lastIndexOf(thunk: T | T[I], fromIndex?: number): number; /** * Determines whether all the members of an array satisfy the specified test. * @param callbackfn A function that accepts up to three arguments. The every method calls * the callbackfn function for each element in the array until the callbackfn returns a value * which is coercible to the Boolean value false, or until the end of the array. */ every(callbackfn: (value: T, index: number, array: T[]) => unknown): boolean; /** * Determines whether the specified callback function returns true for any element of an array. * @param callbackfn A function that accepts up to three arguments. The some method calls * the callbackfn function for each element in the array until the callbackfn returns a value * which is coercible to the Boolean value true, or until the end of the array. */ some(callbackfn: (value: T, index: number, array: T[]) => unknown): boolean; /** * Performs the specified action for each element in an array. * @param callbackfn A function that accepts up to three arguments. forEach calls the callbackfn function one time for each element in the array. */ forEach(callbackfn: (value: T, index: number, array: T[]) => void): void; /** * Calls a defined callback function on each element of an array, and returns an array that contains the results. * @param callbackfn A function that accepts up to three arguments. The map method calls the callbackfn function one time for each element in the array. */ map<U>(callbackfn: (value: T, index: number, array: T[]) => U): U[]; /** * Returns the elements of an array that meet the condition specified in a callback function. * @param callbackfn A function that accepts up to three arguments. The filter method calls the callbackfn function one time for each element in the array. * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value. */ filter<S extends T>(callbackfn: (value: T, index: number, array: T[]) => value is S): S[]; /** * Returns the elements of an array that meet the condition specified in a callback function. * @param callbackfn A function that accepts up to three arguments. The filter method calls the callbackfn function one time for each element in the array. * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value. */ filter(callbackfn: (value: T, index: number, array: T[]) => unknown): T[]; /** Removes the last item and returns it. */ pop(): T | undefined; /** Reverse the items */ reverse(): this; /** Returns an iterable of the items */ values(): IterableIterator<T>; [Symbol.iterator](): IterableIterator<T>; /** The values of the set items in the same order as the `ids` */ get array(): T[]; get length(): number; subscribe(listener: ItemsChangeListener<T, I>): UnsubscribeFn; subscribe(keys: [], listener: ItemsChangeListener<T, I>): UnsubscribeFn; subscribe(id: T[I], listener: ChangeListener<T>): UnsubscribeFn; subscribe(keys: [T[I]], listener: ChangeListener<T>): UnsubscribeFn; subscribe<K extends keyof T>(id: T[I], key: K, listener: ChangeListener<T[K]>): UnsubscribeFn; subscribe<K extends keyof T>(keys: [T[I], K], listener: ChangeListener<T[K]>): UnsubscribeFn; subscribe<K1 extends keyof T, K2 extends keyof T[K1]>(id: T[I], _1: K1, _2: K2, listener: ChangeListener<T[K1][K2]>): UnsubscribeFn; subscribe<K1 extends keyof T, K2 extends keyof T[K1]>(keys: [T[I], K1, K2], listener: ChangeListener<T[K1][K2]>): UnsubscribeFn; subscribe<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2]>(id: T[I], _1: K1, _2: K2, _3: K3, listener: ChangeListener<T[K1][K2][K3]>): UnsubscribeFn; subscribe<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2]>(keys: [T[I], K1, K2, K3], listener: ChangeListener<T[K1][K2][K3]>): UnsubscribeFn; subscribe<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3]>(id: T[I], _1: K1, _2: K2, _3: K3, _4: K4, listener: ChangeListener<T[K1][K2][K3][K4]>): UnsubscribeFn; subscribe<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3]>(keys: [T[I], K1, K2, K3, K4], listener: ChangeListener<T[K1][K2][K3][K4]>): UnsubscribeFn; subscribe<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4]>(id: T[I], _1: K1, _2: K2, _3: K3, _4: K4, _5: K5, listener: ChangeListener<T[K1][K2][K3][K4][K5]>): UnsubscribeFn; subscribe<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4]>(keys: [T[I], K1, K2, K3, K4, K5], listener: ChangeListener<T[K1][K2][K3][K4][K5]>): UnsubscribeFn; subscribe<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4], K6 extends keyof T[K1][K2][K3][K4][K5]>(id: T[I], _1: K1, _2: K2, _3: K3, _4: K4, _5: K5, _6: K6, listener: ChangeListener<T[K1][K2][K3][K4][K5][K6]>): UnsubscribeFn; subscribe<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4], K6 extends keyof T[K1][K2][K3][K4][K5]>(keys: [T[I], K1, K2, K3, K4, K5, K6], listener: ChangeListener<T[K1][K2][K3][K4][K5][K6]>): UnsubscribeFn; subscribe<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4], K6 extends keyof T[K1][K2][K3][K4][K5], K7 extends keyof T[K1][K2][K3][K4][K5][K6]>(id: T[I], _1: K1, _2: K2, _3: K3, _4: K4, _5: K5, _6: K6, _7: K6, listener: ChangeListener<T[K1][K2][K3][K4][K5][K6][K7]>): UnsubscribeFn; subscribe<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4], K6 extends keyof T[K1][K2][K3][K4][K5], K7 extends keyof T[K1][K2][K3][K4][K5][K6]>(keys: [T[I], K1, K2, K3, K4, K5, K6, K7], listener: ChangeListener<T[K1][K2][K3][K4][K5][K6][K7]>): UnsubscribeFn; get(): ItemRecord<T, I>; get(keys: []): ItemRecord<T, I>; get(id: T[I]): T; get(keys: [T[I]]): T; get<K extends keyof T>(id: T[I], key: K): T[K]; get<K extends keyof T>(keys: [T[I], K]): T[K]; get<K1 extends keyof T, K2 extends keyof T[K1]>(id: T[I], _1: K1, _2: K2): T[K1][K2]; get<K1 extends keyof T, K2 extends keyof T[K1]>(keys: [T[I], K1, K2]): T[K1][K2]; get<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2]>(id: T[I], _1: K1, _2: K2, _3: K3): T[K1][K2][K3]; get<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2]>(keys: [T[I], K1, K2, K3]): T[K1][K2][K3]; get<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3]>(id: T[I], _1: K1, _2: K2, _3: K3, _4: K4): T[K1][K2][K3][K4]; get<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3]>(keys: [T[I], K1, K2, K3, K4]): T[K1][K2][K3][K4]; get<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4]>(id: T[I], _1: K1, _2: K2, _3: K3, _4: K4, _5: K5): T[K1][K2][K3][K4][K5]; get<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4]>(keys: [T[I], K1, K2, K3, K4, K5]): T[K1][K2][K3][K4][K5]; get<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4], K6 extends keyof T[K1][K2][K3][K4][K5]>(id: T[I], _1: K1, _2: K2, _3: K3, _4: K4, _5: K5, _6: K6): T[K1][K2][K3][K4][K5][K6]; get<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4], K6 extends keyof T[K1][K2][K3][K4][K5]>(keys: [T[I], K1, K2, K3, K4, K5, K6]): T[K1][K2][K3][K4][K5][K6]; get<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4], K6 extends keyof T[K1][K2][K3][K4][K5], K7 extends keyof T[K1][K2][K3][K4][K5][K6]>(id: T[I], _1: K1, _2: K2, _3: K3, _4: K4, _5: K5, _6: K6, _7: K6): T[K1][K2][K3][K4][K5][K6][K7]; get<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4], K6 extends keyof T[K1][K2][K3][K4][K5], K7 extends keyof T[K1][K2][K3][K4][K5][K6]>(keys: [T[I], K1, K2, K3, K4, K5, K6, K7]): T[K1][K2][K3][K4][K5][K6][K7]; protected get rootSubscriptionArgs(): (T[] | T[I][])[]; private get internalIds(); get readonly(): ReadonlyAbonItems<T, I>; static record<T extends object, I extends keyof T>(items: T[], idKey: I): Record<ItemRecordKey<T, I>, T>; static ids<T extends object, I extends keyof T>(items: T[], idKey: I): T[I][]; static use<T extends object, I extends keyof T>(idKey: I, initial?: () => T[], deps?: readonly any[]): AbonItems<T, I>; static use<T extends object>(initial?: () => T, deps?: readonly any[]): AbonDeep<T>; static useRef<T extends object, I extends keyof T>(idKey: I, initial?: () => T[], deps?: readonly any[]): AbonItems<T, I>; static useRef<T extends object>(initial?: () => T, deps?: readonly any[]): AbonDeep<T>; } interface ReadonlyAbonItems<T extends object, I extends keyof T> extends Omit<AbonItems<T, I>, "set" | "notify" | "readonly" | "pop" | "push" | "unshift" | "set" | "delete" | "ids" | "current" | "notify" | "use" | "reverse"> { ids: AbonArray<T[I]>["readonly"]; readonly current: ItemRecord<T, I>; use(): ReadonlyAbonItems<T, I>; use(keys: []): ReadonlyAbonItems<T, I>; use<K extends keyof T>(key: K): T[K]; use<K extends keyof T>(keys: [K]): T[K]; use<K1 extends keyof T, K2 extends keyof T[K1]>(_1: K1, _2: K2): T[K1][K2]; use<K1 extends keyof T, K2 extends keyof T[K1]>(keys: [K1, K2]): T[K1][K2]; use<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2]>(_1: K1, _2: K2, _3: K3): T[K1][K2][K3]; use<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2]>(keys: [K1, K2, K3]): T[K1][K2][K3]; use<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3]>(_1: K1, _2: K2, _3: K3, _4: K4): T[K1][K2][K3][K4]; use<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3]>(keys: [K1, K2, K3, K4]): T[K1][K2][K3][K4]; use<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4]>(_1: K1, _2: K2, _3: K3, _4: K4, _5: K5): T[K1][K2][K3][K4][K5]; use<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4]>(keys: [K1, K2, K3, K4, K5]): T[K1][K2][K3][K4][K5]; use<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4], K6 extends keyof T[K1][K2][K3][K4][K5]>(_1: K1, _2: K2, _3: K3, _4: K4, _5: K5, _6: K6): T[K1][K2][K3][K4][K5][K6]; use<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4], K6 extends keyof T[K1][K2][K3][K4][K5]>(keys: [K1, K2, K3, K4, K5, K6]): T[K1][K2][K3][K4][K5][K6]; use<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4], K6 extends keyof T[K1][K2][K3][K4][K5], K7 extends keyof T[K1][K2][K3][K4][K5][K6]>(_1: K1, _2: K2, _3: K3, _4: K4, _5: K5, _6: K6, _7: K6): T[K1][K2][K3][K4][K5][K6][K7]; use<K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4], K6 extends keyof T[K1][K2][K3][K4][K5], K7 extends keyof T[K1][K2][K3][K4][K5][K6]>(keys: [K1, K2, K3, K4, K5, K6, K7]): T[K1][K2][K3][K4][K5][K6][K7]; } export {};