reactronic
Version:
Reactronic - Transactional Reactive State Management
138 lines (137 loc) • 8.09 kB
TypeScript
import { LoggingOptions } from "../Logging.js";
import { ReconciliationList, ReconciliationListReader, LinkedItem } from "../util/ReconciliationList.js";
import { Priority, Mode } from "../Enums.js";
import { ReactivityOptions } from "../Options.js";
import { SxObject } from "../core/Mvcc.js";
export type Script<E> = (o: E, basis: () => void) => void;
export type ScriptAsync<E> = (o: E, basis: () => Promise<void>) => Promise<void>;
export type Handler<E = unknown, R = void> = (o: E) => R;
export declare function declare<E = void>(driver: ReactiveTreeNodeDriver<E>, script?: Script<E>, scriptAsync?: ScriptAsync<E>, key?: string, mode?: Mode, preparation?: Script<E>, preparationAsync?: ScriptAsync<E>, finalization?: Script<E>, triggers?: unknown, basis?: ReactiveTreeNodeDecl<E>): ReactiveTreeNode<E>;
export declare function declare<E = void>(driver: ReactiveTreeNodeDriver<E>, declaration?: ReactiveTreeNodeDecl<E>): ReactiveTreeNode<E>;
export declare function declare<E = void>(driver: ReactiveTreeNodeDriver<E>, scriptOrDeclaration?: Script<E> | ReactiveTreeNodeDecl<E>, scriptAsync?: ScriptAsync<E>, key?: string, mode?: Mode, preparation?: Script<E>, preparationAsync?: ScriptAsync<E>, finalization?: Script<E>, triggers?: unknown, basis?: ReactiveTreeNodeDecl<E>): ReactiveTreeNode<E>;
export declare function derivative<E = void>(declaration?: ReactiveTreeNodeDecl<E>, basis?: ReactiveTreeNodeDecl<E>): ReactiveTreeNodeDecl<E>;
export declare function launch<T>(node: ReactiveTreeNode<T>, triggers?: unknown): ReactiveTreeNode<T>;
export declare abstract class ReactiveTreeNode<E = unknown> {
static readonly shortFrameDuration = 16;
static readonly longFrameDuration = 300;
static frameDuration: number;
static currentScriptPriority: Priority;
abstract readonly key: string;
abstract readonly driver: ReactiveTreeNodeDriver<E>;
abstract readonly declaration: Readonly<ReactiveTreeNodeDecl<E>>;
abstract readonly level: number;
abstract readonly owner: ReactiveTreeNode;
abstract element: E;
abstract readonly host: ReactiveTreeNode;
abstract readonly children: ReconciliationListReader<ReactiveTreeNode>;
abstract readonly slot: LinkedItem<ReactiveTreeNode<E>> | undefined;
abstract readonly stamp: number;
abstract readonly outer: ReactiveTreeNode;
abstract readonly context: ReactiveTreeNodeContext | undefined;
abstract priority?: Priority;
abstract childrenShuffling: boolean;
abstract strictOrder: boolean;
abstract getUri(relativeTo?: ReactiveTreeNode<any>): string;
abstract has(mode: Mode): boolean;
abstract configureReactivity(options: Partial<ReactivityOptions>): ReactivityOptions;
static get current(): ReactiveTreeNode;
static get isFirstScriptRun(): boolean;
static launchScript(node: ReactiveTreeNode<any>, triggers: unknown): void;
static launchFinalization(node: ReactiveTreeNode<any>): void;
static launchNestedNodesThenDo(action: (error: unknown) => void): void;
static markAsMounted(node: ReactiveTreeNode<any>, yes: boolean): void;
lookupTreeNodeByUri<E = unknown>(uri: string): ReactiveTreeNode<E> | undefined;
static findMatchingHost<E = unknown, R = unknown>(node: ReactiveTreeNode<E>, match: Handler<ReactiveTreeNode<E>, boolean>): ReactiveTreeNode<R> | undefined;
static findMatchingPrevSibling<E = unknown, R = unknown>(node: ReactiveTreeNode<E>, match: Handler<ReactiveTreeNode<E>, boolean>): ReactiveTreeNode<R> | undefined;
static forEachChildRecursively<E = unknown>(node: ReactiveTreeNode<E>, action: Handler<ReactiveTreeNode<E>>): void;
static getDefaultLoggingOptions(): LoggingOptions | undefined;
static setDefaultLoggingOptions(logging?: LoggingOptions): void;
}
export type ReactiveTreeNodeDecl<E = unknown> = {
script?: Script<E>;
scriptAsync?: ScriptAsync<E>;
key?: string;
mode?: Mode;
preparation?: Script<E>;
preparationAsync?: ScriptAsync<E>;
finalization?: Script<E>;
triggers?: unknown;
basis?: ReactiveTreeNodeDecl<E>;
};
export type ReactiveTreeNodeDriver<E = unknown> = {
readonly name: string;
readonly isPartition: boolean;
readonly initialize?: Handler<E>;
create(node: ReactiveTreeNode<E>): E;
runPreparation(node: ReactiveTreeNode<E>): void;
runFinalization(node: ReactiveTreeNode<E>, isLeader: boolean): boolean;
runMount(node: ReactiveTreeNode<E>): void;
runScript(node: ReactiveTreeNode<E>): void | Promise<void>;
declareChild(ownerNode: ReactiveTreeNode<E>, childDriver: ReactiveTreeNodeDriver<any>, childDeclaration?: ReactiveTreeNodeDecl<any>, childBasis?: ReactiveTreeNodeDecl<any>): LinkedItem<ReactiveTreeNode> | undefined;
provideHost(node: ReactiveTreeNode<E>): ReactiveTreeNode<E>;
};
export type ReactiveTreeNodeContext<T extends Object = Object> = {
value: T;
};
export declare abstract class BaseDriver<E = unknown> implements ReactiveTreeNodeDriver<E> {
readonly name: string;
readonly isPartition: boolean;
readonly initialize?: Handler<E> | undefined;
constructor(name: string, isPartition: boolean, initialize?: Handler<E> | undefined);
abstract create(node: ReactiveTreeNode<E>): E;
runPreparation(node: ReactiveTreeNode<E>): void | Promise<void>;
runFinalization(node: ReactiveTreeNode<E>, isLeader: boolean): boolean;
runMount(node: ReactiveTreeNode<E>): void;
runScript(node: ReactiveTreeNode<E>): void | Promise<void>;
declareChild(ownerNode: ReactiveTreeNode<E>, childDriver: ReactiveTreeNodeDriver<any>, childDeclaration?: ReactiveTreeNodeDecl<any>, childBasis?: ReactiveTreeNodeDecl<any>): LinkedItem<ReactiveTreeNode> | undefined;
provideHost(node: ReactiveTreeNode<E>): ReactiveTreeNode<E>;
}
export declare class ReactiveTreeVariable<T extends Object = Object> {
readonly defaultValue: T | undefined;
constructor(defaultValue?: T);
set value(value: T);
get value(): T;
get valueOrUndefined(): T | undefined;
}
export declare function generateKey(owner?: ReactiveTreeNode$): string;
export declare function getModeUsingBasisChain(declaration?: ReactiveTreeNodeDecl<any>): Mode;
declare class ReactiveTreeNodeContext$<T extends Object = Object> extends SxObject implements ReactiveTreeNodeContext<T> {
next: ReactiveTreeNodeContext$<object> | undefined;
variable: ReactiveTreeVariable<T>;
value: T;
constructor(variable: ReactiveTreeVariable<T>, value: T);
}
declare class ReactiveTreeNode$<E = unknown> extends ReactiveTreeNode<E> {
static logging: LoggingOptions | undefined;
static grandNodeCount: number;
static disposableNodeCount: number;
readonly key: string;
readonly driver: ReactiveTreeNodeDriver<E>;
declaration: ReactiveTreeNodeDecl<E>;
readonly level: number;
readonly owner: ReactiveTreeNode$;
readonly element: E;
host: ReactiveTreeNode$;
readonly children: ReconciliationList<ReactiveTreeNode$>;
slot: LinkedItem<ReactiveTreeNode$<E>> | undefined;
stamp: number;
outer: ReactiveTreeNode$;
context: ReactiveTreeNodeContext$<any> | undefined;
numerator: number;
priority: Priority;
childrenShuffling: boolean;
constructor(key: string, driver: ReactiveTreeNodeDriver<E>, declaration: Readonly<ReactiveTreeNodeDecl<E>>, owner: ReactiveTreeNode$ | undefined);
getUri(relativeTo?: ReactiveTreeNode<any>): string;
get strictOrder(): boolean;
set strictOrder(value: boolean);
get isMoved(): boolean;
has(mode: Mode): boolean;
script(_triggers: unknown): void;
configureReactivity(options: Partial<ReactivityOptions>): ReactivityOptions;
static get nodeSlot(): LinkedItem<ReactiveTreeNode$>;
static tryUseTreeVariableValue<T extends Object>(variable: ReactiveTreeVariable<T>): T | undefined;
static useTreeVariableValue<T extends Object>(variable: ReactiveTreeVariable<T>): T;
static setTreeVariableValue<T extends Object>(variable: ReactiveTreeVariable<T>, value: T | undefined): void;
}
export declare function signalsAreEqual(a1: any, a2: any): boolean;
export {};