UNPKG

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
"use strict"; /** * 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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