@dependable/state
Version:
Observables and computeds for reactive state management
117 lines (108 loc) • 2.33 kB
TypeScript
/**
* A state listener.
*/
export type StateListener = {
(updated: Subscribables): void;
};
/**
* A subscriber function that will be called by the subscribables that it is
* subscribed to.
*/
export type Subscriber = {
(): void;
};
/**
* A subscribable object.
*/
export interface Subscribable {
/**
* The id of the subscribable.
*/
id?: string;
/**
* The kind of subscribable.
*/
kind: "observable" | "computed";
/**
* Add the given subscriber to this subscribable.
*
* @param subscriber the subscriber that should be added
* @param priority the priority of this subscriber; lower numbers takes precedence.
*
* Defaults to zero.
*/
subscribe(subscriber: Subscriber, priority?: number): void;
/**
* Remove the given subscriber to this subscribable.
*
* @param subscriber the subscriber that should be removed
*/
unsubscribe(subscriber: Subscriber): void;
}
/**
* An observable value that can be subscribed to.
*
* @template T the type of the observable value.
*/
export type Observable<T> = Subscribable & {
/**
* Update the value of the observable.
*
* @param value the new value
*/
(value: T): void;
/**
* Get the value of the observable.
*
* @returns the value of the observable.
*/
(): T;
};
/**
* A computed value that can be subscribed to. It updates whenever any of its
* dependencies updates.
*
* @template T the type of the computed value.
*/
export type Computed<T> = Subscribable & {
/**
* Get the value of the computed.
*
* @returns the value of the computed.
*/
(): T;
};
/**
* An equality function deciding if two values is equal or not.
*
* @template T the type of the values to compare.
*/
export type Equality<T> = {
(a: T, b: T): boolean;
};
/**
* Options for a subscribable.
*/
export type SubscribableOptions = {
/**
* The id of the subscribable.
*
* Used for debugging and development tools.
*/
id?: string;
};
/**
* Options for a subscribable.
*
* @template T the type computed value.
*/
export type ComputedOptions<T> = SubscribableOptions & {
/**
* A function deciding if the value of the subscribable has changed.
*/
isEqual?: Equality<T>;
};
/**
* The set of active subscribables.
*/
export type Subscribables = Set<Subscribable>;