UNPKG

@cycle/run

Version:

The Cycle.js run() function to use with xstream

93 lines 3.21 kB
import xs from 'xstream'; import quicktask from 'quicktask'; import { adapt } from './adapt'; export function makeSinkProxies(drivers) { var sinkProxies = {}; for (var name_1 in drivers) { if (drivers.hasOwnProperty(name_1)) { sinkProxies[name_1] = xs.create(); } } return sinkProxies; } export function callDrivers(drivers, sinkProxies) { var sources = {}; for (var name_2 in drivers) { if (drivers.hasOwnProperty(name_2)) { sources[name_2] = drivers[name_2](sinkProxies[name_2], name_2); if (sources[name_2] && typeof sources[name_2] === 'object') { sources[name_2]._isCycleSource = name_2; } } } return sources; } // NOTE: this will mutate `sources`. export function adaptSources(sources) { for (var name_3 in sources) { if (sources.hasOwnProperty(name_3) && sources[name_3] && typeof sources[name_3].shamefullySendNext === 'function') { sources[name_3] = adapt(sources[name_3]); } } return sources; } export function replicateMany(sinks, sinkProxies) { var scheduleMicrotask = quicktask(); var sinkNames = Object.keys(sinks).filter(function (name) { return !!sinkProxies[name]; }); var buffers = {}; var replicators = {}; sinkNames.forEach(function (name) { buffers[name] = { _n: [], _e: [] }; replicators[name] = { next: function (x) { return buffers[name]._n.push(x); }, error: function (err) { return buffers[name]._e.push(err); }, complete: function () { }, }; }); var subscriptions = sinkNames.map(function (name) { return xs.fromObservable(sinks[name]).subscribe(replicators[name]); }); sinkNames.forEach(function (name) { var listener = sinkProxies[name]; var next = function (x) { scheduleMicrotask(function () { return listener._n(x); }); }; var error = function (err) { scheduleMicrotask(function () { (console.error || console.log)(err); listener._e(err); }); }; buffers[name]._n.forEach(next); buffers[name]._e.forEach(error); replicators[name].next = next; replicators[name].error = error; // because sink.subscribe(replicator) had mutated replicator to add // _n, _e, _c, we must also update these: replicators[name]._n = next; replicators[name]._e = error; }); buffers = null; // free up for GC return function disposeReplication() { subscriptions.forEach(function (s) { return s.unsubscribe(); }); }; } export function disposeSinkProxies(sinkProxies) { Object.keys(sinkProxies).forEach(function (name) { return sinkProxies[name]._c(); }); } export function disposeSources(sources) { for (var k in sources) { if (sources.hasOwnProperty(k) && sources[k] && sources[k].dispose) { sources[k].dispose(); } } } export function isObjectEmpty(obj) { return Object.keys(obj).length === 0; } //# sourceMappingURL=internals.js.map