defmodule Thulani.Util.Stream do def take_until(enum, fun) when :erlang.is_function(fun, 1) do lazy(enum, fn f1 -> fn entry, acc -> if(fun.(entry)) do {:cont, result} = f1.(entry, acc) {:halt, result} else f1.(entry, acc) end end end) end @compile {:inline, lazy: 2} defp lazy(%Stream{done: nil, funs: funs} = lazy, fun), do: %{lazy | funs: [fun | funs]} defp lazy(enum, fun), do: %Stream{enum: enum, funs: [fun]} end