Packages

Lazy, external iterators for Elixir.

Current section

Files

Jump to
iterex lib iter iterable with_indexer.ex
Raw

lib/iter/iterable/with_indexer.ex

defmodule Iter.Iterable.WithIndexer do
defstruct iterable: nil, count: 0
@moduledoc """
Creates an iterator which emits the current iteration count as well as the next value.
"""
alias Iter.{Impl, IntoIterable, Iterable}
@type t :: %__MODULE__{
iterable: Iterable.t(),
count: 0
}
@doc """
Create a new filter iterable.
"""
@spec new(Iterable.t()) :: Iterable.t()
def new(iterable), do: %__MODULE__{iterable: iterable}
defimpl Iterable do
use Impl
@doc false
@impl true
def next(enumerator) do
with {:ok, element, iterable} <- Iterable.next(enumerator.iterable) do
{:ok, {element, enumerator.count},
%{enumerator | iterable: iterable, count: enumerator.count + 1}}
end
end
end
defimpl IntoIterable do
@doc false
def into_iterable(self), do: self
end
end