callbag-remember
Version:
👜 Callbag operator which shares input stream between subscribers and emits last emitted value upon subscription.
80 lines (61 loc) • 1.37 kB
JavaScript
var noop = function noop() {};
var UNIQUE = {};
function remember(source) {
var sinks = [];
var inited = false;
var endValue = UNIQUE;
var sourceTalkback;
var value;
return function (start, sink) {
if (start !== 0) return;
if (endValue !== UNIQUE) {
sink(0, noop);
if (inited) {
sink(1, value);
}
sink(2, endValue);
return;
}
sinks.push(sink);
var talkback = function talkback(type, data) {
if (type === 2) {
var index = sinks.indexOf(sink);
if (index !== -1) {
sinks.splice(index, 1);
}
return;
}
if (endValue !== UNIQUE) {
return;
}
sourceTalkback(type, data);
};
if (sinks.length === 1) {
source(0, function (type, data) {
if (type === 0) {
sourceTalkback = data;
sink(0, talkback);
return;
}
if (type === 1) {
inited = true;
value = data;
}
var sinksCopy = sinks.slice(0);
if (type === 2) {
endValue = data;
sinks = null;
}
sinksCopy.forEach(function (sink) {
sink(type, data);
});
});
return;
}
sink(0, talkback);
if (inited && endValue === UNIQUE) {
sink(1, value);
}
};
}
export default remember;