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.

257 lines 19.3 kB
/** * Stream Coalgebra System * Mathematical foundation for streaming signals using coalgebra patterns * Following the pattern: State → (Output × State) */ import { signal } from '../core/signal'; // Create a streaming signal from a coalgebra export const createStreamingSignal = (initialValue, coalgebra) => { const baseSignal = signal(initialValue); const state = 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 = 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 = 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 = 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 = 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 = 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 = 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 = createStreamingSignal(baseSignal.value()); streamingSignal.subscribe((value) => { if (predicate(value)) { filtered._set(value); } }); return filtered; }, // Transform values transform: (fn) => { const transformed = createStreamingSignal(fn(baseSignal.value())); streamingSignal.subscribe((value) => { transformed._set(fn(value)); }); return transformed; }, // Merge with another stream merge: (other) => { const merged = createStreamingSignal(baseSignal.value()); streamingSignal.subscribe((value) => merged._set(value)); other.subscribe((value) => merged._set(value)); return merged; }, // Debounce emissions debounce: (ms) => { const debounced = 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; }; // Utility function to create a stream from values export const streamFrom = (...values) => { const stream = 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; }; // Create a stream from an async iterable export const streamFromIterable = (iterable) => { const stream = createStreamingSignal(null); (async () => { for await (const value of iterable) { stream._set(value); } })(); return stream; }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29hbGdlYnJhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N0cmVhbWluZy9jb2FsZ2VicmEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBVSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQWlDaEQsNkNBQTZDO0FBQzdDLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLENBQ25DLFlBQWUsRUFDZixTQUE4QyxFQUMxQixFQUFFO0lBQ3RCLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN4QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQWlCO1FBQ25DLE1BQU0sRUFBRSxFQUFFO1FBQ1YsV0FBVyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDdkIsUUFBUSxFQUFFLElBQUk7UUFDZCxVQUFVLEVBQUUsQ0FBQztLQUNkLENBQUMsQ0FBQztJQUVILE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUFzQixDQUFDO0lBQ2xELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQXNCLENBQUM7SUFFeEQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFRLEVBQUUsRUFBRTtRQUMxQixXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDekIsSUFBSSxDQUFDO2dCQUNILEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNaLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLDhEQUE4RDtZQUNoRSxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUMvQixJQUFJLENBQUM7Z0JBQ0gsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ1osQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsOERBQThEO1lBQ2hFLENBQUM7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