open Wonka_types; type delayStateT = { mutable talkback: (.talkbackT) => unit, mutable active: int, mutable gotEndSignal: bool }; let delay = wait => curry(source => curry(sink => { let state: delayStateT = { talkback: Wonka_helpers.talkbackPlaceholder, active: 0, gotEndSignal: false }; source((.signal) => { switch (signal) { | Start(tb) => state.talkback = tb | _ when !state.gotEndSignal => { state.active = state.active + 1; ignore(Js.Global.setTimeout(() => { if (state.gotEndSignal && state.active === 0) { sink(.End); } else { state.active = state.active - 1; }; sink(.signal); }, wait)); } | _ => () } }); sink(.Start((.signal) => { switch (signal) { | Close => { state.gotEndSignal = true; if (state.active === 0) sink(.End); } | _ when !state.gotEndSignal => state.talkback(.signal) | _ => () } })); }));