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.
213 lines • 15 kB
JavaScript
;
/**
* Time Algebra - Clock ticks and temporal operations
* Extends Effect with time-based operations
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.throttle = exports.debounce = exports.interval = exports.timeout = exports.delay = exports.currentTime = exports.time = void 0;
const effect_1 = require("../core/effect");
/**
* Creates a Time effect with temporal operations
*/
const time = (initial) => {
const baseEffect = (0, effect_1.effect)(initial);
const timeInstance = {
value: baseEffect.value,
map: baseEffect.map,
subscribe: baseEffect.subscribe,
bind: baseEffect.bind,
chain: baseEffect.chain,
_set: baseEffect._set,
delay: (ms) => {
const delayed = (0, exports.time)(baseEffect.value());
setTimeout(() => {
delayed._set(baseEffect.value());
}, ms);
// Subscribe to original changes with delay
baseEffect.subscribe((newValue) => {
setTimeout(() => {
delayed._set(newValue);
}, ms);
});
return delayed;
},
timeout: (ms) => {
const timedOut = (0, exports.time)(baseEffect.value());
let hasCompleted = false;
// Set timeout
const timeoutId = setTimeout(() => {
if (!hasCompleted) {
timedOut._set(new Error(`Timeout after ${ms}ms`));
}
}, ms);
// Subscribe to original completion
baseEffect.subscribe((newValue) => {
if (!hasCompleted) {
hasCompleted = true;
clearTimeout(timeoutId);
timedOut._set(newValue);
}
});
return timedOut;
},
interval: (ms) => {
const intervalTime = (0, exports.time)(baseEffect.value());
let intervalId;
let subscriberCount = 0;
let tickCount = 0;
// Create a new Time object with custom subscribe
const customIntervalTime = {
...intervalTime,
subscribe: (fn) => {
subscriberCount++;
// Start interval when first subscriber is added
if (subscriberCount === 1) {
intervalId = setInterval(() => {
tickCount++;
// Force a change by setting a slightly different value
// For primitive types, we can append tick count
const currentValue = baseEffect.value();
if (typeof currentValue === 'number') {
intervalTime._set((currentValue + tickCount * 0.000001));
}
else if (typeof currentValue === 'string') {
intervalTime._set((currentValue + ''));
}
else {
// For objects, create a new reference
intervalTime._set({
...currentValue,
_tick: tickCount,
});
}
}, ms);
}
const unsubscribe = intervalTime.subscribe(fn);
return () => {
subscriberCount--;
if (subscriberCount === 0 && intervalId) {
clearInterval(intervalId);
}
unsubscribe();
};
},
};
return customIntervalTime;
},
// Compatibility methods for factories
now: () => baseEffect.value(),
update: () => {
// Force an update by setting the current value
baseEffect._set(baseEffect.value());
},
};
return timeInstance;
};
exports.time = time;
/**
* Creates a current time effect that updates with the current timestamp
*/
const currentTime = () => {
const timeEffect = (0, exports.time)(Date.now());
// Override the now method to return current timestamp
const currentTimeEffect = {
...timeEffect,
now: () => Date.now(),
update: () => {
timeEffect._set(Date.now());
},
};
return currentTimeEffect;
};
exports.currentTime = currentTime;
/**
* Creates a delayed effect
*/
const delay = (ms, value) => {
return (0, exports.time)(value).delay(ms);
};
exports.delay = delay;
/**
* Creates a timeout effect
*/
const timeout = (ms, effect) => {
const timeEffect = (0, exports.time)(effect.value());
effect.subscribe((value) => timeEffect._set(value));
return timeEffect.timeout(ms);
};
exports.timeout = timeout;
/**
* Creates an interval effect
*/
const interval = (ms, value) => {
const intervalTime = (0, exports.time)(value);
let intervalId;
let subscriberCount = 0;
let tickCount = 0;
// Create a new Time object with custom subscribe
const customIntervalTime = {
...intervalTime,
subscribe: (fn) => {
subscriberCount++;
// Start interval when first subscriber is added
if (subscriberCount === 1) {
intervalId = setInterval(() => {
tickCount++;
// Force a change by setting a slightly different value
if (typeof value === 'number') {
intervalTime._set((value + tickCount * 0.000001));
}
else if (typeof value === 'string') {
intervalTime._set((value + ''));
}
else {
// For objects, create a new reference
intervalTime._set({ ...value, _tick: tickCount });
}
}, ms);
}
const unsubscribe = intervalTime.subscribe(fn);
return () => {
subscriberCount--;
if (subscriberCount === 0 && intervalId) {
clearInterval(intervalId);
}
unsubscribe();
};
},
};
return customIntervalTime;
};
exports.interval = interval;
/**
* Debounce utility using Time algebra
*/
const debounce = (ms, effect) => {
const debounced = (0, exports.time)(effect.value());
let timeoutId;
effect.subscribe((newValue) => {
clearTimeout(timeoutId);
timeoutId = setTimeout(() => {
debounced._set(newValue);
}, ms);
});
return debounced;
};
exports.debounce = debounce;
/**
* Throttle utility using Time algebra
*/
const throttle = (ms, effect) => {
const throttled = (0, exports.time)(effect.value());
let lastExecution = 0;
effect.subscribe((newValue) => {
const now = Date.now();
if (now - lastExecution >= ms) {
throttled._set(newValue);
lastExecution = now;
}
});
return throttled;
};
exports.throttle = throttle;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hbGdlYnJhcy90aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQUVILDJDQUFnRDtBQVdoRDs7R0FFRztBQUNJLE1BQU0sSUFBSSxHQUFHLENBQUksT0FBVSxFQUEwQyxFQUFFO0lBQzVFLE1BQU0sVUFBVSxHQUFHLElBQUEsZUFBTSxFQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRW5DLE1BQU0sWUFBWSxHQUEyQztRQUMzRCxLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUs7UUFDdkIsR0FBRyxFQUFFLFVBQVUsQ0FBQyxHQUFHO1FBQ25CLFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUztRQUMvQixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7UUFDckIsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLO1FBQ3ZCLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSTtRQUVyQixLQUFLLEVBQUUsQ0FBQyxFQUFVLEVBQVcsRUFBRTtZQUM3QixNQUFNLE9BQU8sR0FBRyxJQUFBLFlBQUksRUFBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUV6QyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDbkMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRVAsMkNBQTJDO1lBQzNDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDaEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDZCxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN6QixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDVCxDQUFDLENBQUMsQ0FBQztZQUVILE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFFRCxPQUFPLEVBQUUsQ0FBQyxFQUFV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