abon
Version:
Flexible state management for React 🚀
198 lines (197 loc) • 19.1 kB
TypeScript
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 {};