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.
200 lines • 15.5 kB
JavaScript
/**
* Signal-Σ Extensions
* Advanced primitives for extensibility following mathematical patterns
*/
// Drag-n-Drop System (Operad patterns)
export { DragContainer, createDragContainer, composeDragBehaviors, } from './drag-drop';
// Real-time Sync System (Commutative monoid operations)
export { RealtimeSync, createRealtimeSync, createSyncedCounter, createSyncedSet, createSyncedRegister, } from './realtime-sync';
// Theme System (Functor map patterns)
export { ThemeManager, createThemeManager, createLightTheme, createDarkTheme, composeThemes, mapThemeColors, } from './theme-system';
// Undo/Redo System (Coalgebraic time-travel)
export { UndoRedoManager, createUndoRedoManager, createCommand, createTextCommand, createArrayCommand, } from './undo-redo';
// Extension utilities and patterns
export const ExtensionPatterns = {
// Operad composition for UI components
Operad: {
compose: (f, g) => (a) => g(f(a)),
plug: (outer, inner) => (t) => outer(inner(t)),
identity: (x) => x,
},
// Commutative monoid for data synchronization
CommutativeMonoid: {
empty: () => [],
combine: (a, b) => [...a, ...b],
isCommutative: true,
isAssociative: true,
hasIdentity: true,
},
// Functor for theme transformations
Functor: {
map: (f) => (fa) => fa.map(f),
identity: (fa) => fa,
composition: (f, g) => (a) => g(f(a)),
},
// Coalgebra for time-travel and state evolution
Coalgebra: {
unfold: (seed, next) => {
const result = [];
let current = seed;
while (true) {
const [value, nextState] = next(current);
result.push(value);
current = nextState;
// Prevent infinite loops in example
if (result.length > 1000)
break;
}
return result;
},
observe: (state, observer) => observer(state),
transition: (state, transition) => transition(state),
},
};
// Extension factory for creating custom extensions
export const createExtension = (name, pattern, implementation) => {
return {
name,
pattern,
create: implementation.create,
compose: implementation.compose,
map: implementation.map,
unfold: implementation.unfold,
// Mathematical properties verification
verify: () => {
switch (pattern) {
case 'operad':
return {
hasIdentity: true,
hasComposition: !!implementation.compose,
isAssociative: true, // Assumed for operads
};
case 'monoid':
return {
hasIdentity: true,
hasComposition: !!implementation.compose,
isAssociative: true,
isCommutative: true, // For commutative monoids
};
case 'functor':
return {
hasMap: !!implementation.map,
preservesIdentity: true,
preservesComposition: true,
};
case 'coalgebra':
return {
hasUnfold: !!implementation.unfold,
isObservable: true,
hasTransitions: true,
};
default:
return {};
}
},
};
};
// Example extensions using the factory
export const ExampleExtensions = {
// Drag-drop as operad
DragDropOperad: createExtension('drag-drop', 'operad', {
create: (config) => ({
container: config.container,
items: config.items,
options: config.options,
}),
compose: (a, b) => ({ behaviors: [a, b] }),
}),
// Sync as commutative monoid
SyncMonoid: createExtension('realtime-sync', 'monoid', {
create: (config) => ({ config }),
compose: (a, _b) => {
// Merge sync managers (theoretical - would need careful implementation)
return a; // Simplified
},
}),
// Theme as functor
ThemeFunctor: createExtension('theme-system', 'functor', {
create: (config) => ({ config }),
map: (transform, theme) => ({ theme, transform }),
}),
// Undo/Redo as coalgebra
UndoRedoCoalgebra: createExtension('undo-redo', 'coalgebra', {
create: (config) => ({
initialState: config.initialState,
options: config.options,
}),
unfold: (manager, _next) => {
// Unfold history states
const history = manager.getHistory().value();
return history.map((memento) => memento.state);
},
}),
};
// Extension composition utilities
export const composeExtensions = (...extensions) => {
// Compose multiple extensions following their mathematical patterns
return extensions.reduce((acc, ext) => {
// Implementation would depend on the specific extension types
return { ...acc, ...ext };
});
};
// Extension validation
export const validateExtension = (extension) => {
try {
const verification = extension.verify?.();
// Check mathematical properties based on pattern
switch (extension.pattern) {
case 'operad':
return verification?.hasIdentity && verification?.hasComposition;
case 'monoid':
return (verification?.hasIdentity &&
verification?.hasComposition &&
verification?.isAssociative);
case 'functor':
return verification?.hasMap && verification?.preservesIdentity;
case 'coalgebra':
return verification?.hasUnfold && verification?.isObservable;
default:
return true;
}
}
catch (error) {
console.error('Extension validation failed:', error);
return false;
}
};
// Extension registry for dynamic loading
export class ExtensionRegistry {
constructor() {
this.extensions = new Map();
}
register(name, extension) {
if (validateExtension(extension)) {
this.extensions.set(name, extension);
}
else {
throw new Error(`Extension ${name} failed validation`);
}
}
get(name) {
return this.extensions.get(name);
}
list() {
return Array.from(this.extensions.keys());
}
compose(names) {
const extensions = names
.map((name) => this.extensions.get(name))
.filter(Boolean);
return composeExtensions(...extensions);
}
}
// Global extension registry
export const globalExtensionRegistry = new ExtensionRegistry();
// Auto-register built-in extensions
globalExtensionRegistry.register('drag-drop', ExampleExtensions.DragDropOperad);
globalExtensionRegistry.register('realtime-sync', ExampleExtensions.SyncMonoid);
globalExtensionRegistry.register('theme-system', ExampleExtensions.ThemeFunctor);
globalExtensionRegistry.register('undo-redo', ExampleExtensions.UndoRedoCoalgebra);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZXh0ZW5zaW9ucy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCx1Q0FBdUM7QUFDdkMsT0FBTyxFQUNMLGFBQWEsRUFDYixtQkFBbUIsRUFDbkIsb0JBQW9CLEdBSXJCLE1BQU0sYUFBYSxDQUFDO0FBRXJCLHdEQUF3RDtBQUN4RCxPQUFPLEVBQ0wsWUFBWSxFQUNaLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsZUFBZSxFQUNmLG9CQUFvQixHQUtyQixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLHNDQUFzQztBQUN0QyxPQUFPLEVBQ0wsWUFBWSxFQUNaLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsZUFBZSxFQUNmLGFBQWEsRUFDYixjQUFjLEdBTWYsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4Qiw2Q0FBNkM7QUFDN0MsT0FBTyxFQUNMLGVBQWUsRUFDZixxQkFBcUIsRUFDckIsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixrQkFBa0IsR0FLbkIsTUFBTSxhQUFhLENBQUM7QUFFckIsbUNBQW1DO0FBQ25DLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHO0lBQy9CLHVDQUF1QztJQUN2QyxNQUFNLEVBQUU7UUFDTixPQUFPLEVBQ0wsQ0FBVSxDQUFjLEVBQUUsQ0FBYyxFQUFFLEVBQUUsQ0FDNUMsQ0FBQyxDQUFJLEVBQUUsRUFBRSxDQUNQLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDWCxJQUFJLEVBQ0YsQ0FBVSxLQUFrQixFQUFFLEtBQWtCLEVBQUUsRUFBRSxDQUNwRCxDQUFDLENBQUksRUFBRSxFQUFFLENBQ1AsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQixRQUFRLEVBQUUsQ0FBSSxDQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDekI7SUFFRCw4Q0FBOEM7SUFDOUMsaUJB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