open Wonka_types; type fromArrayState('a) = { mutable index: int, mutable ended: bool, mutable looping: bool, mutable pull: bool }; let fromArray = arr => curry(sink => { let size = Rebel.Array.size(arr); let state = { index: 0, ended: false, looping: false, pull: false }; sink(.Start((.signal) => { switch (signal, state.looping) { | (Pull, false) => { state.pull = true; state.looping = true; while (state.pull && !state.ended) { let index = state.index; if (index < size) { let x = Rebel.Array.getUnsafe(arr, index); state.index = index + 1; state.pull = false; sink(.Push(x)); } else { state.ended = true; sink(.End); } }; state.looping = false; } | (Pull, true) => state.pull = true | (Close, _) => state.ended = true } })); });