Mirror: 🎩 A tiny but capable push & pull stream library for TypeScript and Flow

Fix switchMap and concatMap not forwarding Push before Start (#69)

* Fix switchMap and concatMap not forwarding Push before Start

This is technically incorrect, but a lot of asynchronous
sources will Push eagerly, which means Start doesn't
always get to talk first.

* Readd state.innerActive guard to switchMap

Changed files
+25 -23
src
+25 -23
src/Wonka_operators.re
···
ended: false,
};
-
let rec applyInnerSource = innerSource =>
+
let rec applyInnerSource = innerSource => {
+
state.innerActive = true;
innerSource((. signal) =>
switch (signal) {
| Start(tb) =>
-
state.innerActive = true;
state.innerTalkback = tb;
state.innerPulled = false;
tb(. Pull);
···
| End => ()
}
);
+
};
source((. signal) =>
switch (signal) {
···
ended: false,
};
-
let applyInnerSource = innerSource =>
+
let applyInnerSource = innerSource => {
+
state.innerActive = true;
innerSource((. signal) =>
-
switch (signal) {
-
| Start(tb) =>
-
state.innerActive = true;
-
state.innerTalkback = tb;
-
state.innerPulled = false;
-
tb(. Pull);
-
| Push(_) when state.innerActive =>
-
sink(. signal);
-
if (!state.innerPulled) {
-
state.innerTalkback(. Pull);
-
} else {
+
if (state.innerActive) {
+
switch (signal) {
+
| Start(tb) =>
+
state.innerTalkback = tb;
state.innerPulled = false;
-
};
-
| Push(_) => ()
-
| End when state.innerActive =>
-
state.innerActive = false;
-
if (state.ended) {
+
tb(. Pull);
+
| Push(_) =>
sink(. signal);
-
} else if (!state.outerPulled) {
-
state.outerPulled = true;
-
state.outerTalkback(. Pull);
+
if (!state.innerPulled) {
+
state.innerTalkback(. Pull);
+
} else {
+
state.innerPulled = false;
+
};
+
| End =>
+
state.innerActive = false;
+
if (state.ended) {
+
sink(. signal);
+
} else if (!state.outerPulled) {
+
state.outerPulled = true;
+
state.outerTalkback(. Pull);
+
};
};
-
| End => ()
}
);
+
};
source((. signal) =>
switch (signal) {