resig.js
Version:
Universal reactive signal library with complete platform features: signals, animations, CRDTs, scheduling, DOM integration. Works identically across React, SolidJS, Svelte, Vue, and Qwik.
59 lines (58 loc) • 2.41 kB
TypeScript
/**
* CRDT (Conflict-free Replicated Data Types) Core Primitives
* Following categorical design principles with commutative monoid laws
*/
import { Signal } from '../core/signal';
export interface CRDT<T> {
readonly value: () => T;
readonly merge: (other: any) => void;
readonly clone: () => CRDT<T>;
readonly toJSON: () => any;
readonly fromJSON: (json: any) => void;
}
export interface Timestamp {
readonly time: number;
readonly nodeId: string;
}
export declare const timestamp: (nodeId?: string) => Timestamp;
export declare const compareTimestamps: (a: Timestamp, b: Timestamp) => number;
export interface CRDTOperation {
readonly type: string;
readonly value: any;
readonly timestamp?: Timestamp;
readonly crdtId: string;
}
export interface GCounter extends CRDT<number> {
readonly increment: (amount?: number) => void;
}
export declare const gCounter: (nodeId?: string) => GCounter;
export interface PNCounter extends CRDT<number> {
readonly increment: (amount?: number) => void;
readonly decrement: (amount?: number) => void;
}
export declare const pnCounter: (nodeId?: string) => PNCounter;
export interface GSet<T> extends CRDT<Set<T>> {
readonly add: (element: T) => void;
readonly has: (element: T) => boolean;
}
export declare const gSet: <T>() => GSet<T>;
export interface LWWRegister<T> extends CRDT<T | undefined> {
readonly set: (value: T) => void;
readonly getTimestamp: () => Timestamp | undefined;
}
export declare const lwwRegister: <T>(nodeId?: string, initialValue?: T) => LWWRegister<T>;
export interface ORSet<T> extends CRDT<Set<T>> {
readonly add: (element: T) => void;
readonly remove: (element: T) => void;
readonly has: (element: T) => boolean;
}
export declare const orSet: <T>(nodeId?: string) => ORSet<T>;
export interface ReactiveCRDT<T, C extends CRDT<T>> {
readonly crdt: C;
readonly signal: Signal<T>;
readonly subscribe: (fn: (value: T) => void) => () => void;
}
export declare const reactiveGCounter: (nodeId?: string) => ReactiveCRDT<number, GCounter>;
export declare const reactivePNCounter: (nodeId?: string) => ReactiveCRDT<number, PNCounter>;
export declare const reactiveORSet: <T>(nodeId?: string) => ReactiveCRDT<Set<T>, ORSet<T>>;
export declare const reactiveLWWRegister: <T>(nodeId?: string, initialValue?: T) => ReactiveCRDT<T | undefined, LWWRegister<T>>;