defmodule Drop do
@doc ~S"""
Drop Function.
Similar to `Stream.drop`, but STRICTLY drops first `n` elements (n > 0).
## Examples
iex> Sequences.fibs |> Drop.drop(5) |> Enum.take(5)
[8, 13, 21, 34, 55]
"""
def drop(enum, count) do
fun = fn
(v, 0) -> {:suspend, v}
(_, n) -> {:cont, n - 1}
end
case Enumerable.reduce(enum, {:cont, count - 1}, fun) do
{:halted, _} -> []
{:done, _} -> []
{:suspended, _, next_fun} -> &do_drop(next_fun, &1, &2)
end
end
defp do_drop(_, {:halt, acc}, _fun), do: {:halted, acc}
defp do_drop(next, {:suspend, acc}, fun) do
{:suspended, acc, &do_drop(next, &1, fun)}
end
defp do_drop(next, {:cont, acc}, fun) do
case next.({:cont, 0}) do
{:halted, _} -> {:halted, acc}
{:done, _} -> {:done, acc}
{:suspended, v, next_fun} -> do_drop(next_fun, fun.(v, acc), fun)
end
end
# fibs from Sequences.ex
defp fibs do
&fibs({1, 1}, &1, &2)
end
defp fibs(_, {:halt, acc}, _fun), do: {:halted, acc}
defp fibs(v, {:suspend, acc}, fun), do: {:suspended, acc, &fibs(v, &1, fun)}
defp fibs({a, b}, {:cont, acc}, fun), do: fibs({b, a + b}, fun.(a, acc), fun)
def run do
IO.
puts "enum0 = fibs |> Stream.map(&IO.inspect/1)" enum0 = fibs |> Stream.map(&IO.inspect/1)
IO.
puts "enum1 = enum0 |> drop(5)" enum1 = enum0 |> drop(5)
IO.
puts "enum1 |> Enum.take(5) |> IO.inspect" enum1 |> Enum.take(5) |> IO.inspect
IO.
puts "enum1 |> Enum.at(5) |> IO.inspect" enum1 |> Enum.at(5) |> IO.inspect
end
end
Drop.run
ZGVmbW9kdWxlIERyb3AgZG8KICBAZG9jIH5TIiIiCiAgRHJvcCBGdW5jdGlvbi4KICBTaW1pbGFyIHRvIGBTdHJlYW0uZHJvcGAsIGJ1dCBTVFJJQ1RMWSBkcm9wcyBmaXJzdCBgbmAgZWxlbWVudHMgKG4gPiAwKS4KCiAgIyMgRXhhbXBsZXMKICAKICAgIGlleD4gU2VxdWVuY2VzLmZpYnMgfD4gRHJvcC5kcm9wKDUpIHw+IEVudW0udGFrZSg1KQogICAgWzgsIDEzLCAyMSwgMzQsIDU1XQogICIiIgogIGRlZiBkcm9wKGVudW0sIGNvdW50KSBkbwogICAgZnVuID0gZm4KICAgICAgKHYsIDApIC0+IHs6c3VzcGVuZCwgdn0KICAgICAgKF8sIG4pIC0+IHs6Y29udCwgbiAtIDF9CiAgICBlbmQKICAgIGNhc2UgRW51bWVyYWJsZS5yZWR1Y2UoZW51bSwgezpjb250LCBjb3VudCAtIDF9LCBmdW4pIGRvCiAgICAgIHs6aGFsdGVkLCBffSAtPiBbXQogICAgICB7OmRvbmUsIF99ICAgLT4gW10KICAgICAgezpzdXNwZW5kZWQsIF8sIG5leHRfZnVufSAtPiAmZG9fZHJvcChuZXh0X2Z1biwgJjEsICYyKQogICAgZW5kCiAgZW5kCgogIGRlZnAgZG9fZHJvcChfLCB7OmhhbHQsIGFjY30sIF9mdW4pLCBkbzogezpoYWx0ZWQsIGFjY30KICBkZWZwIGRvX2Ryb3AobmV4dCwgezpzdXNwZW5kLCBhY2N9LCBmdW4pIGRvCiAgICB7OnN1c3BlbmRlZCwgYWNjLCAmZG9fZHJvcChuZXh0LCAmMSwgZnVuKX0KICBlbmQKICBkZWZwIGRvX2Ryb3AobmV4dCwgezpjb250LCBhY2N9LCBmdW4pIGRvCiAgICBjYXNlIG5leHQuKHs6Y29udCwgMH0pIGRvCiAgICAgIHs6aGFsdGVkLCBffSAtPiB7OmhhbHRlZCwgYWNjfQogICAgICB7OmRvbmUsIF99IC0+IHs6ZG9uZSwgYWNjfQogICAgICB7OnN1c3BlbmRlZCwgdiwgbmV4dF9mdW59IC0+IGRvX2Ryb3AobmV4dF9mdW4sIGZ1bi4odiwgYWNjKSwgZnVuKQogICAgZW5kCiAgZW5kCgogICMgZmlicyBmcm9tIFNlcXVlbmNlcy5leAogIGRlZnAgZmlicyBkbwogICAgJmZpYnMoezEsIDF9LCAmMSwgJjIpCiAgZW5kCgogIGRlZnAgZmlicyhfLCB7OmhhbHQsIGFjY30sIF9mdW4pLCBkbzogezpoYWx0ZWQsIGFjY30KICBkZWZwIGZpYnModiwgezpzdXNwZW5kLCBhY2N9LCBmdW4pLCBkbzogezpzdXNwZW5kZWQsIGFjYywgJmZpYnModiwgJjEsIGZ1bil9CiAgZGVmcCBmaWJzKHthLCBifSwgezpjb250LCBhY2N9LCBmdW4pLCBkbzogZmlicyh7YiwgYSArIGJ9LCBmdW4uKGEsIGFjYyksIGZ1bikKCiAgZGVmIHJ1biBkbwogICAgSU8ucHV0cyAiZW51bTAgPSBmaWJzIHw+IFN0cmVhbS5tYXAoJklPLmluc3BlY3QvMSkiCiAgICBlbnVtMCA9IGZpYnMgfD4gU3RyZWFtLm1hcCgmSU8uaW5zcGVjdC8xKQogICAgSU8ucHV0cyAiZW51bTEgPSBlbnVtMCB8PiBkcm9wKDUpIgogICAgZW51bTEgPSBlbnVtMCB8PiBkcm9wKDUpCiAgICBJTy5wdXRzICJlbnVtMSB8PiBFbnVtLnRha2UoNSkgfD4gSU8uaW5zcGVjdCIKICAgIGVudW0xIHw+IEVudW0udGFrZSg1KSB8PiBJTy5pbnNwZWN0CiAgICBJTy5wdXRzICJlbnVtMSB8PiBFbnVtLmF0KDUpIHw+IElPLmluc3BlY3QiCiAgICBlbnVtMSB8PiBFbnVtLmF0KDUpIHw+IElPLmluc3BlY3QKICBlbmQKZW5kCgpEcm9wLnJ1bg==