open Wonka_types; let throttle = f => curry(source => curry(sink => { let skip = ref(false); let id: ref(option(Js.Global.timeoutId)) = ref(None); let clearTimeout = () => switch (id^) { | Some(timeoutId) => Js.Global.clearTimeout(timeoutId) | None => () }; source((. signal) => switch (signal) { | Start(tb) => sink(. Start( (. signal) => switch (signal) { | Close => clearTimeout(); tb(. Close); | _ => tb(. signal) }, ), ) | End => clearTimeout(); sink(. End); | Push(x) when ! skip^ => skip := true; clearTimeout(); id := Some( Js.Global.setTimeout( () => { id := None; skip := false; }, f(. x), ), ); sink(. signal); | Push(_) => () } ); }) );