@cycle/run
Version:
The Cycle.js run() function to use with xstream
93 lines • 3.21 kB
JavaScript
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