import * as Block from "bs-platform/lib/es6/block.js";
import * as Curry from "bs-platform/lib/es6/curry.js";
import * as Caml_option from "bs-platform/lib/es6/caml_option.js";
import * as Wonka_helpers from "./helpers/Wonka_helpers.bs.js";
import * as Wonka_sources from "./Wonka_sources.bs.js";
import * as MutableQueue_js from "./include/rebel_js/MutableQueue_js.bs.js";
function buffer(notifier) {
return (function (source) {
return (function (sink) {
var state = {
buffer: new Array(),
sourceTalkback: Wonka_helpers.talkbackPlaceholder,
notifierTalkback: Wonka_helpers.talkbackPlaceholder,
pulled: false,
ended: false
};
Curry._1(source, (function (signal) {
if (typeof signal === "number") {
if (!state.ended) {
state.ended = true;
state.notifierTalkback(/* Close */1);
if (state.buffer.length > 0) {
sink(/* Push */Block.__(1, [state.buffer]));
}
sink(/* End */0);
}
} else if (signal.tag) {
if (!state.ended) {
state.buffer.push(signal[0]);
if (state.pulled) {
state.pulled = false;
} else {
state.pulled = true;
state.sourceTalkback(/* Pull */0);
state.notifierTalkback(/* Pull */0);
}
}
} else {
state.sourceTalkback = signal[0];
Curry._1(notifier, (function (signal) {
if (typeof signal === "number") {
if (!state.ended) {
state.ended = true;
state.sourceTalkback(/* Close */1);
if (state.buffer.length > 0) {
sink(/* Push */Block.__(1, [state.buffer]));
}
sink(/* End */0);
}
} else if (signal.tag) {
if (!state.ended && state.buffer.length > 0) {
var buffer = state.buffer;
state.buffer = new Array();
sink(/* Push */Block.__(1, [buffer]));
}
} else {
state.notifierTalkback = signal[0];
}
}));
}
}));
return sink(/* Start */Block.__(0, [(function (signal) {
if (!state.ended) {
if (signal) {
state.ended = true;
state.sourceTalkback(/* Close */1);
return state.notifierTalkback(/* Close */1);
} else if (!state.pulled) {
state.pulled = true;
state.sourceTalkback(/* Pull */0);
return state.notifierTalkback(/* Pull */0);
} else {
return ;
}
}
})]));
});
});
}
function combine(sourceA, sourceB) {
return (function (sink) {
var state = {
talkbackA: Wonka_helpers.talkbackPlaceholder,
talkbackB: Wonka_helpers.talkbackPlaceholder,
lastValA: undefined,
lastValB: undefined,
gotSignal: false,
endCounter: 0,
ended: false
};
Curry._1(sourceA, (function (signal) {
var match = state.lastValB;
if (typeof signal === "number") {
if (state.endCounter < 1) {
state.endCounter = state.endCounter + 1 | 0;
return ;
} else if (!state.ended) {
state.ended = true;
return sink(/* End */0);
} else {
return ;
}
}
if (!signal.tag) {
state.talkbackA = signal[0];
return ;
}
var a = signal[0];
if (match !== undefined) {
if (!state.ended) {
state.lastValA = Caml_option.some(a);
state.gotSignal = false;
return sink(/* Push */Block.__(1, [/* tuple */[
a,
Caml_option.valFromOption(match)
]]));
} else {
return ;
}
} else {
state.lastValA = Caml_option.some(a);
if (state.gotSignal) {
state.gotSignal = false;
return ;
} else {
return state.talkbackB(/* Pull */0);
}
}
}));
Curry._1(sourceB, (function (signal) {
var match = state.lastValA;
if (typeof signal === "number") {
if (state.endCounter < 1) {
state.endCounter = state.endCounter + 1 | 0;
return ;
} else if (!state.ended) {
state.ended = true;
return sink(/* End */0);
} else {
return ;
}
}
if (!signal.tag) {
state.talkbackB = signal[0];
return ;
}
var b = signal[0];
if (match !== undefined) {
if (!state.ended) {
state.lastValB = Caml_option.some(b);
state.gotSignal = false;
return sink(/* Push */Block.__(1, [/* tuple */[
Caml_option.valFromOption(match),
b
]]));
} else {
return ;
}
} else {
state.lastValB = Caml_option.some(b);
if (state.gotSignal) {
state.gotSignal = false;
return ;
} else {
return state.talkbackA(/* Pull */0);
}
}
}));
return sink(/* Start */Block.__(0, [(function (signal) {
if (!state.ended) {
if (signal) {
state.ended = true;
state.talkbackA(/* Close */1);
return state.talkbackB(/* Close */1);
} else if (!state.gotSignal) {
state.gotSignal = true;
state.talkbackA(signal);
return state.talkbackB(signal);
} else {
return ;
}
}
})]));
});
}
function concatMap(f) {
return (function (source) {
return (function (sink) {
var state = {
inputQueue: new Array(),
outerTalkback: Wonka_helpers.talkbackPlaceholder,
outerPulled: false,
innerTalkback: Wonka_helpers.talkbackPlaceholder,
innerActive: false,
innerPulled: false,
ended: false
};
var applyInnerSource = function (innerSource) {
state.innerActive = true;
Curry._1(innerSource, (function (signal) {
if (typeof signal === "number") {
if (state.innerActive) {
state.innerActive = false;
var input = state.inputQueue.shift();
if (input !== undefined) {
applyInnerSource(f(Caml_option.valFromOption(input)));
} else if (state.ended) {
sink(/* End */0);
} else if (!state.outerPulled) {
state.outerPulled = true;
state.outerTalkback(/* Pull */0);
}
}
} else if (signal.tag) {
if (state.innerActive) {
sink(signal);
if (state.innerPulled) {
state.innerPulled = false;
} else {
state.innerTalkback(/* Pull */0);
}
}
} else {
var tb = signal[0];
state.innerTalkback = tb;
state.innerPulled = false;
tb(/* Pull */0);
}
}));
};
Curry._1(source, (function (signal) {
if (typeof signal === "number") {
if (!state.ended) {
state.ended = true;
if (!state.innerActive && MutableQueue_js.isEmpty(state.inputQueue)) {
sink(/* End */0);
}
}
} else if (signal.tag) {
if (!state.ended) {
var x = signal[0];
state.outerPulled = false;
if (state.innerActive) {
state.inputQueue.push(x);
} else {
applyInnerSource(f(x));
}
}
} else {
state.outerTalkback = signal[0];
}
}));
return sink(/* Start */Block.__(0, [(function (signal) {
if (signal) {
if (!state.ended) {
state.ended = true;
state.outerTalkback(/* Close */1);
}
if (state.innerActive) {
state.innerActive = false;
return state.innerTalkback(/* Close */1);
} else {
return ;
}
} else {
if (!state.ended && !state.outerPulled) {
state.outerPulled = true;
state.outerTalkback(/* Pull */0);
}
if (state.innerActive && !state.innerPulled) {
state.innerPulled = true;
return state.innerTalkback(/* Pull */0);
} else {
return ;
}
}
})]));
});
});
}
function concatAll(source) {
return concatMap((function (x) {
return x;
}))(source);
}
function concat(sources) {
return concatMap((function (x) {
return x;
}))(Wonka_sources.fromArray(sources));
}
function filter(f) {
return (function (source) {
return (function (sink) {
var talkback = {
contents: Wonka_helpers.talkbackPlaceholder
};
return Curry._1(source, (function (signal) {
if (typeof signal === "number") {
sink(signal);
} else if (signal.tag) {
if (f(signal[0])) {
sink(signal);
} else {
talkback.contents(/* Pull */0);
}
} else {
talkback.contents = signal[0];
sink(signal);
}
}));
});
});
}
function map(f) {
return (function (source) {
return (function (sink) {
return Curry._1(source, (function (signal) {
var tmp;
tmp = typeof signal === "number" ? /* End */0 : (
signal.tag ? /* Push */Block.__(1, [f(signal[0])]) : /* Start */Block.__(0, [signal[0]])
);
return sink(tmp);
}));
});
});
}
function mergeMap(f) {
return (function (source) {
return (function (sink) {
var state = {
outerTalkback: Wonka_helpers.talkbackPlaceholder,
outerPulled: false,
innerTalkbacks: new Array(),
ended: false
};
var applyInnerSource = function (innerSource) {
var talkback = {
contents: Wonka_helpers.talkbackPlaceholder
};
return Curry._1(innerSource, (function (signal) {
if (typeof signal === "number") {
if (state.innerTalkbacks.length === 0) {
return ;
}
state.innerTalkbacks = state.innerTalkbacks.filter((function (x) {
return x !== talkback.contents;
}));
var exhausted = state.innerTalkbacks.length === 0;
if (state.ended && exhausted) {
return sink(/* End */0);
} else if (!state.outerPulled && exhausted) {
state.outerPulled = true;
return state.outerTalkback(/* Pull */0);
} else {
return ;
}
}
if (signal.tag) {
if (state.innerTalkbacks.length !== 0) {
sink(/* Push */Block.__(1, [signal[0]]));
return talkback.contents(/* Pull */0);
} else {
return ;
}
}
var tb = signal[0];
talkback.contents = tb;
state.innerTalkbacks = state.innerTalkbacks.concat(tb);
return tb(/* Pull */0);
}));
};
Curry._1(source, (function (signal) {
if (typeof signal === "number") {
if (!state.ended) {
state.ended = true;
if (state.innerTalkbacks.length === 0) {
return sink(/* End */0);
} else {
return ;
}
} else {
return ;
}
} else if (signal.tag) {
if (!state.ended) {
state.outerPulled = false;
applyInnerSource(f(signal[0]));
if (!state.outerPulled) {
state.outerPulled = true;
return state.outerTalkback(/* Pull */0);
} else {
return ;
}
} else {
return ;
}
} else {
state.outerTalkback = signal[0];
return ;
}
}));
return sink(/* Start */Block.__(0, [(function (signal) {
if (signal) {
if (!state.ended) {
state.ended = true;
state.outerTalkback(signal);
}
state.innerTalkbacks.forEach((function (tb) {
return tb(signal);
}));
state.innerTalkbacks = new Array();
return ;
} else {
if (!state.outerPulled && !state.ended) {
state.outerPulled = true;
state.outerTalkback(/* Pull */0);
} else {
state.outerPulled = false;
}
state.innerTalkbacks.forEach((function (tb) {
return tb(/* Pull */0);
}));
return ;
}
})]));
});
});
}
function merge(sources) {
return mergeMap((function (x) {
return x;
}))(Wonka_sources.fromArray(sources));
}
function mergeAll(source) {
return mergeMap((function (x) {
return x;
}))(source);
}
function onEnd(f) {
return (function (source) {
return (function (sink) {
var ended = {
contents: false
};
return Curry._1(source, (function (signal) {
if (typeof signal === "number") {
if (!ended.contents) {
ended.contents = true;
sink(signal);
return f();
} else {
return ;
}
}
if (signal.tag) {
if (!ended.contents) {
return sink(signal);
} else {
return ;
}
}
var talkback = signal[0];
return sink(/* Start */Block.__(0, [(function (signal) {
if (!ended.contents) {
if (signal) {
ended.contents = true;
talkback(signal);
return f();
} else {
return talkback(signal);
}
}
})]));
}));
});
});
}
function onPush(f) {
return (function (source) {
return (function (sink) {
var ended = {
contents: false
};
return Curry._1(source, (function (signal) {
if (typeof signal === "number") {
if (!ended.contents) {
ended.contents = true;
sink(signal);
}
} else if (signal.tag) {
if (!ended.contents) {
f(signal[0]);
sink(signal);
}
} else {
var talkback = signal[0];
sink(/* Start */Block.__(0, [(function (signal) {
if (!ended.contents) {
if (signal) {
ended.contents = true;
return talkback(signal);
} else {
return talkback(signal);
}
}
})]));
}
}));
});
});
}
function onStart(f) {
return (function (source) {
return (function (sink) {
return Curry._1(source, (function (signal) {
if (typeof signal === "number") {
return sink(signal);
}
if (signal.tag) {
return sink(signal);
}
sink(signal);
return f();
}));
});
});
}
function sample(notifier) {
return (function (source) {
return (function (sink) {
var state = {
sourceTalkback: Wonka_helpers.talkbackPlaceholder,
notifierTalkback: Wonka_helpers.talkbackPlaceholder,
value: undefined,
pulled: false,
ended: false
};
Curry._1(source, (function (signal) {
if (typeof signal === "number") {
if (!state.ended) {
state.ended = true;
state.notifierTalkback(/* Close */1);
return sink(/* End */0);
} else {
return ;
}
}
if (!signal.tag) {
state.sourceTalkback = signal[0];
return ;
}
state.value = Caml_option.some(signal[0]);
if (state.pulled) {
state.pulled = false;
return ;
} else {
state.pulled = true;
state.notifierTalkback(/* Pull */0);
return state.sourceTalkback(/* Pull */0);
}
}));
Curry._1(notifier, (function (signal) {
var match = state.value;
if (typeof signal === "number") {
if (!state.ended) {
state.ended = true;
state.sourceTalkback(/* Close */1);
return sink(/* End */0);
} else {
return ;
}
} else if (signal.tag) {
if (match !== undefined && !state.ended) {
state.value = undefined;
return sink(/* Push */Block.__(1, [Caml_option.valFromOption(match)]));
} else {
return ;
}
} else {
state.notifierTalkback = signal[0];
return ;
}
}));
return sink(/* Start */Block.__(0, [(function (signal) {
if (!state.ended) {
if (signal) {
state.ended = true;
state.sourceTalkback(/* Close */1);
return state.notifierTalkback(/* Close */1);
} else if (!state.pulled) {
state.pulled = true;
state.sourceTalkback(/* Pull */0);
return state.notifierTalkback(/* Pull */0);
} else {
return ;
}
}
})]));
});
});
}
function scan(f, seed) {
return (function (source) {
return (function (sink) {
var acc = {
contents: seed
};
return Curry._1(source, (function (signal) {
var tmp;
if (typeof signal === "number") {
tmp = /* End */0;
} else if (signal.tag) {
acc.contents = f(acc.contents, signal[0]);
tmp = /* Push */Block.__(1, [acc.contents]);
} else {
tmp = /* Start */Block.__(0, [signal[0]]);
}
return sink(tmp);
}));
});
});
}
function share(source) {
var state = {
sinks: new Array(),
talkback: Wonka_helpers.talkbackPlaceholder,
gotSignal: false
};
return (function (sink) {
state.sinks = state.sinks.concat(sink);
if (state.sinks.length === 1) {
Curry._1(source, (function (signal) {
if (typeof signal === "number") {
state.sinks.forEach((function (sink) {
return sink(/* End */0);
}));
state.sinks = new Array();
return ;
}
if (!signal.tag) {
state.talkback = signal[0];
return ;
}
state.gotSignal = false;
state.sinks.forEach((function (sink) {
return sink(signal);
}));
}));
}
return sink(/* Start */Block.__(0, [(function (signal) {
if (signal) {
state.sinks = state.sinks.filter((function (x) {
return x !== sink;
}));
if (state.sinks.length === 0) {
return state.talkback(/* Close */1);
} else {
return ;
}
} else if (!state.gotSignal) {
state.gotSignal = true;
return state.talkback(signal);
} else {
return ;
}
})]));
});
}
function skip(wait) {
return (function (source) {
return (function (sink) {
var state = {
talkback: Wonka_helpers.talkbackPlaceholder,
rest: wait
};
return Curry._1(source, (function (signal) {
if (typeof signal === "number") {
return sink(signal);
}
if (signal.tag) {
if (state.rest > 0) {
state.rest = state.rest - 1 | 0;
return state.talkback(/* Pull */0);
} else {
return sink(signal);
}
}
state.talkback = signal[0];
return sink(signal);
}));
});
});
}
function skipUntil(notifier) {
return (function (source) {
return (function (sink) {
var state = {
sourceTalkback: Wonka_helpers.talkbackPlaceholder,
notifierTalkback: Wonka_helpers.talkbackPlaceholder,
skip: true,
pulled: false,
ended: false
};
Curry._1(source, (function (signal) {
if (typeof signal === "number") {
if (state.skip) {
state.notifierTalkback(/* Close */1);
}
state.ended = true;
sink(/* End */0);
} else if (signal.tag) {
if (!state.skip && !state.ended) {
state.pulled = false;
sink(signal);
} else if (state.pulled) {
state.pulled = false;
} else {
state.pulled = true;
state.sourceTalkback(/* Pull */0);
state.notifierTalkback(/* Pull */0);
}
} else {
state.sourceTalkback = signal[0];
Curry._1(notifier, (function (signal) {
if (typeof signal === "number") {
if (state.skip) {
state.ended = true;
state.sourceTalkback(/* Close */1);
}
} else if (signal.tag) {
state.skip = false;
state.notifierTalkback(/* Close */1);
} else {
var innerTb = signal[0];
state.notifierTalkback = innerTb;
innerTb(/* Pull */0);
}
}));
}
}));
return sink(/* Start */Block.__(0, [(function (signal) {
if (!state.ended) {
if (signal) {
state.ended = true;
state.sourceTalkback(/* Close */1);
if (state.skip) {
return state.notifierTalkback(/* Close */1);
} else {
return ;
}
} else if (!state.pulled) {
state.pulled = true;
if (state.skip) {
state.notifierTalkback(/* Pull */0);
}
return state.sourceTalkback(/* Pull */0);
} else {
return ;
}
}
})]));
});
});
}
function skipWhile(f) {
return (function (source) {
return (function (sink) {
var state = {
talkback: Wonka_helpers.talkbackPlaceholder,
skip: true
};
return Curry._1(source, (function (signal) {
if (typeof signal === "number") {
return sink(signal);
}
if (signal.tag) {
if (state.skip) {
if (f(signal[0])) {
return state.talkback(/* Pull */0);
} else {
state.skip = false;
return sink(signal);
}
} else {
return sink(signal);
}
}
state.talkback = signal[0];
return sink(signal);
}));
});
});
}
function switchMap(f) {
return (function (source) {
return (function (sink) {
var state = {
outerTalkback: Wonka_helpers.talkbackPlaceholder,
outerPulled: false,
innerTalkback: Wonka_helpers.talkbackPlaceholder,
innerActive: false,
innerPulled: false,
ended: false
};
var applyInnerSource = function (innerSource) {
state.innerActive = true;
Curry._1(innerSource, (function (signal) {
if (!state.innerActive) {
return ;
}
if (typeof signal === "number") {
state.innerActive = false;
if (state.ended) {
return sink(signal);
} else if (!state.outerPulled) {
state.outerPulled = true;
return state.outerTalkback(/* Pull */0);
} else {
return ;
}
}
if (signal.tag) {
sink(signal);
if (state.innerPulled) {
state.innerPulled = false;
return ;
} else {
return state.innerTalkback(/* Pull */0);
}
}
var tb = signal[0];
state.innerTalkback = tb;
state.innerPulled = false;
return tb(/* Pull */0);
}));
};
Curry._1(source, (function (signal) {
if (typeof signal === "number") {
if (!state.ended) {
state.ended = true;
if (!state.innerActive) {
sink(/* End */0);
}
}
} else if (signal.tag) {
if (!state.ended) {
if (state.innerActive) {
state.innerTalkback(/* Close */1);
state.innerTalkback = Wonka_helpers.talkbackPlaceholder;
}
if (state.outerPulled) {
state.outerPulled = false;
} else {
state.outerPulled = true;
state.outerTalkback(/* Pull */0);
}
applyInnerSource(f(signal[0]));
}
} else {
state.outerTalkback = signal[0];
}
}));
return sink(/* Start */Block.__(0, [(function (signal) {
if (signal) {
if (!state.ended) {
state.ended = true;
state.outerTalkback(/* Close */1);
}
if (state.innerActive) {
state.innerActive = false;
return state.innerTalkback(/* Close */1);
} else {
return ;
}
} else {
if (!state.ended && !state.outerPulled) {
state.outerPulled = true;
state.outerTalkback(/* Pull */0);
}
if (state.innerActive && !state.innerPulled) {
state.innerPulled = true;
return state.innerTalkback(/* Pull */0);
} else {
return ;
}
}
})]));
});
});
}
function switchAll(source) {
return switchMap((function (x) {
return x;
}))(source);
}
function take(max) {
return (function (source) {
return (function (sink) {
var state = {
ended: false,
taken: 0,
talkback: Wonka_helpers.talkbackPlaceholder
};
Curry._1(source, (function (signal) {
if (typeof signal === "number") {
if (!state.ended) {
state.ended = true;
return sink(/* End */0);
} else {
return ;
}
}
if (signal.tag) {
if (state.taken < max && !state.ended) {
state.taken = state.taken + 1 | 0;
sink(signal);
if (!state.ended && state.taken >= max) {
state.ended = true;
sink(/* End */0);
return state.talkback(/* Close */1);
} else {
return ;
}
} else {
return ;
}
}
var tb = signal[0];
if (max <= 0) {
state.ended = true;
sink(/* End */0);
return tb(/* Close */1);
} else {
state.talkback = tb;
return ;
}
}));
return sink(/* Start */Block.__(0, [(function (signal) {
if (!state.ended) {
if (signal) {
state.ended = true;
return state.talkback(/* Close */1);
} else if (state.taken < max) {
return state.talkback(/* Pull */0);
} else {
return ;
}
}
})]));
});
});
}
function takeLast(max) {
return (function (source) {
return (function (sink) {
var state = {
queue: new Array(),
talkback: Wonka_helpers.talkbackPlaceholder
};
return Curry._1(source, (function (signal) {
if (typeof signal === "number") {
Wonka_sources.fromArray(state.queue)(sink);
} else if (signal.tag) {
var size = state.queue.length;
if (size >= max && max > 0) {
state.queue.shift();
}
state.queue.push(signal[0]);
state.talkback(/* Pull */0);
} else {
var talkback = signal[0];
if (max <= 0) {
talkback(/* Close */1);
Wonka_sources.empty(sink);
} else {
state.talkback = talkback;
talkback(/* Pull */0);
}
}
}));
});
});
}
function takeUntil(notifier) {
return (function (source) {
return (function (sink) {
var state = {
ended: false,
sourceTalkback: Wonka_helpers.talkbackPlaceholder,
notifierTalkback: Wonka_helpers.talkbackPlaceholder
};
Curry._1(source, (function (signal) {
if (typeof signal === "number") {
if (!state.ended) {
state.ended = true;
state.notifierTalkback(/* Close */1);
sink(/* End */0);
}
} else if (signal.tag) {
if (!state.ended) {
sink(signal);
}
} else {
state.sourceTalkback = signal[0];
Curry._1(notifier, (function (signal) {
if (typeof signal !== "number") {
if (signal.tag) {
state.ended = true;
state.sourceTalkback(/* Close */1);
sink(/* End */0);
} else {
var innerTb = signal[0];
state.notifierTalkback = innerTb;
innerTb(/* Pull */0);
}
}
}));
}
}));
return sink(/* Start */Block.__(0, [(function (signal) {
if (!state.ended) {
if (signal) {
state.ended = true;
state.sourceTalkback(/* Close */1);
return state.notifierTalkback(/* Close */1);
} else {
return state.sourceTalkback(/* Pull */0);
}
}
})]));
});
});
}
function takeWhile(f) {
return (function (source) {
return (function (sink) {
var state = {
talkback: Wonka_helpers.talkbackPlaceholder,
ended: false
};
return Curry._1(source, (function (signal) {
if (typeof signal === "number") {
if (!state.ended) {
state.ended = true;
return sink(/* End */0);
} else {
return ;
}
}
if (signal.tag) {
if (!state.ended) {
if (f(signal[0])) {
return sink(signal);
} else {
state.ended = true;
sink(/* End */0);
return state.talkback(/* Close */1);
}
} else {
return ;
}
}
state.talkback = signal[0];
return sink(signal);
}));
});
});
}
var flatten = mergeAll;
var tap = onPush;
export {
buffer ,
combine ,
concatMap ,
concatAll ,
concat ,
filter ,
map ,
mergeMap ,
merge ,
mergeAll ,
flatten ,
onEnd ,
onPush ,
tap ,
onStart ,
sample ,
scan ,
share ,
skip ,
skipUntil ,
skipWhile ,
switchMap ,
switchAll ,
take ,
takeLast ,
takeUntil ,
takeWhile ,
}
/* No side effect */