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.
263 lines • 19.9 kB
JavaScript
;
/**
* Stream Coalgebra System
* Mathematical foundation for streaming signals using coalgebra patterns
* Following the pattern: State → (Output × State)
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.streamFromIterable = exports.streamFrom = exports.createStreamingSignal = void 0;
const signal_1 = require("../core/signal");
// Create a streaming signal from a coalgebra
const createStreamingSignal = (initialValue, coalgebra) => {
const baseSignal = (0, signal_1.signal)(initialValue);
const state = (0, signal_1.signal)({
buffer: [],
lastEmitted: Date.now(),
isActive: true,
errorCount: 0,
});
const subscribers = new Set();
const streamSubscribers = new Set();
const notify = (value) => {
subscribers.forEach((fn) => {
try {
fn(value);
}
catch (error) {
// Suppress subscription errors to prevent stream interruption
}
});
streamSubscribers.forEach((fn) => {
try {
fn(value);
}
catch (error) {
// Suppress subscription errors to prevent stream interruption
}
});
};
const streamingSignal = {
value: baseSignal.value,
map: (f) => {
const mapped = (0, exports.createStreamingSignal)(f(baseSignal.value()));
baseSignal.subscribe((value) => mapped._set(f(value)));
return mapped;
},
subscribe: (fn) => {
subscribers.add(fn);
return () => subscribers.delete(fn);
},
// Async iteration support
stream: async function* () {
const values = [];
let resolve = null;
const unsubscribe = streamingSignal.subscribe((value) => {
if (resolve) {
resolve(value);
resolve = null;
}
else {
values.push(value);
}
});
try {
while (state.value().isActive) {
if (values.length > 0) {
yield values.shift();
}
else {
yield await new Promise((res) => {
resolve = res;
});
}
}
}
finally {
unsubscribe();
}
},
// Buffer values into arrays
buffer: (size) => {
const buffered = (0, signal_1.signal)([]);
const buffer = [];
streamingSignal.subscribe((value) => {
buffer.push(value);
if (buffer.length >= size) {
buffered._set([
...buffer,
]);
buffer.splice(0, buffer.length);
}
});
return buffered;
},
// Throttle emissions
throttle: (ms) => {
const throttled = (0, exports.createStreamingSignal)(baseSignal.value());
let lastEmit = 0;
let timeoutId = null;
let pendingValue = null;
streamingSignal.subscribe((value) => {
const now = Date.now();
pendingValue = value;
if (now - lastEmit >= ms) {
lastEmit = now;
throttled._set(value);
pendingValue = null;
}
else if (!timeoutId) {
timeoutId = (typeof window !== 'undefined' ? window.setTimeout : setTimeout)(() => {
if (pendingValue !== null) {
throttled._set(pendingValue);
lastEmit = Date.now();
}
timeoutId = null;
pendingValue = null;
}, ms - (now - lastEmit));
}
});
return throttled;
},
// Handle backpressure
backpressure: (strategy) => {
const backpressured = (0, exports.createStreamingSignal)(baseSignal.value());
const maxBuffer = 1000;
const buffer = [];
let emittedCount = 0;
streamingSignal.subscribe((value) => {
switch (strategy) {
case 'drop':
if (emittedCount < maxBuffer) {
backpressured._set(value);
emittedCount++;
}
// Drop values beyond maxBuffer
break;
case 'buffer':
buffer.push(value);
if (buffer.length > 0) {
backpressured._set(buffer.shift());
}
break;
case 'error':
if (emittedCount >= maxBuffer) {
throw new Error('Stream buffer overflow');
}
backpressured._set(value);
emittedCount++;
break;
}
});
return backpressured;
},
// Take only first n values
take: (count) => {
const taken = (0, exports.createStreamingSignal)(baseSignal.value());
let emitted = 0;
streamingSignal.subscribe((value) => {
if (emitted < count) {
taken._set(value);
emitted++;
if (emitted >= count) {
taken.state.value().isActive = false;
}
}
});
return taken;
},
// Skip first n values
skip: (count) => {
const skipped = (0, exports.createStreamingSignal)(baseSignal.value());
let skippedCount = 0;
streamingSignal.subscribe((value) => {
if (skippedCount >= count) {
skipped._set(value);
}
else {
skippedCount++;
}
});
return skipped;
},
// Filter values
filter: (predicate) => {
const filtered = (0, exports.createStreamingSignal)(baseSignal.value());
streamingSignal.subscribe((value) => {
if (predicate(value)) {
filtered._set(value);
}
});
return filtered;
},
// Transform values
transform: (fn) => {
const transformed = (0, exports.createStreamingSignal)(fn(baseSignal.value()));
streamingSignal.subscribe((value) => {
transformed._set(fn(value));
});
return transformed;
},
// Merge with another stream
merge: (other) => {
const merged = (0, exports.createStreamingSignal)(baseSignal.value());
streamingSignal.subscribe((value) => merged._set(value));
other.subscribe((value) => merged._set(value));
return merged;
},
// Debounce emissions
debounce: (ms) => {
const debounced = (0, exports.createStreamingSignal)(baseSignal.value());
let timeoutId = null;
streamingSignal.subscribe((value) => {
if (timeoutId) {
clearTimeout(timeoutId);
}
timeoutId = (typeof window !== 'undefined' ? window.setTimeout : setTimeout)(() => {
debounced._set(value);
timeoutId = null;
}, ms);
});
return debounced;
},
};
// Add _set method for internal use
streamingSignal._set = (value) => {
baseSignal._set(value);
notify(value);
// Apply coalgebra if provided
if (coalgebra) {
const currentState = state.value();
coalgebra.observe(currentState);
const newState = coalgebra.transition(currentState);
state._set(newState);
}
};
streamingSignal.state = state;
return streamingSignal;
};
exports.createStreamingSignal = createStreamingSignal;
// Utility function to create a stream from values
const streamFrom = (...values) => {
const stream = (0, exports.createStreamingSignal)(values[0] || null);
// Emit values asynchronously
Promise.resolve().then(async () => {
for (const value of values) {
stream._set(value);
await new Promise((resolve) => setTimeout(resolve, 0));
}
});
return stream;
};
exports.streamFrom = streamFrom;
// Create a stream from an async iterable
const streamFromIterable = (iterable) => {
const stream = (0, exports.createStreamingSignal)(null);
(async () => {
for await (const value of iterable) {
stream._set(value);
}
})();
return stream;
};
exports.streamFromIterable = streamFromIterable;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29hbGdlYnJhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N0cmVhbWluZy9jb2FsZ2VicmEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7OztBQUVILDJDQUFnRDtBQWlDaEQsNkNBQTZDO0FBQ3RDLE1BQU0scUJBQXFCLEdBQUcsQ0FDbkMsWUFBZSxFQUNmLFNBQThDLEVBQzFCLEVBQUU7SUFDdEIsTUFBTSxVQUFVLEdBQUcsSUFBQSxlQUFNLEVBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEMsTUFBTSxLQUFLLEdBQUcsSUFBQSxlQUFNLEVBQWlCO1FBQ25DLE1BQU0sRUFBRSxFQUFFO1FBQ1YsV0FBVyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDdkIsUUFBUSxFQUFFLElBQUk7UUFDZCxVQUFVLEVBQUUsQ0FBQztLQUNkLENBQUMsQ0FBQztJQUVILE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUFzQixDQUFDO0lBQ2xELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQXNCLENBQUM7SUFFeEQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFRLEVBQUUsRUFBRTtRQUMxQixXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDekIsSUFBSSxDQUFDO2dCQUNILEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNaLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLDhEQUE4RDtZQUNoRSxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUMvQixJQUFJLENBQUM7Z0JBQ0gsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ1osQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsOERBQThEO1lBQ2hFLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENB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