Files
geef/lib/geef/iterator.ex
Carlos Martín Nieto dea88e5a59 Don't overload the record constructors
Use 'from_erl' instead of 'new' when transforming erlang records into
elixir records.
2013-08-12 14:35:32 +02:00

41 lines
1.0 KiB
Elixir

defrecord Geef.Iterator, Record.extract(:geef_iterator, from: "src/geef_records.hrl") do
alias Geef.Iterator
alias Geef.Reference
@doc false
defmacro rebind(obj) do
quote do
set_elem(unquote(obj), 0, :geef_iterator)
end
end
@spec from_erl(term()) :: t
def from_erl(iterator) do
set_elem(iterator, 0, Geef.Iterator)
end
def stream!(Iterator[type: :ref, repo: repo, regexp: regexp]) do
iter =
case :geef_ref.iterator(repo, regexp) do
{:ok, iter} ->
Iterator.from_erl iter
{:error, error} ->
raise Geef.IteratorError, message: error
end
&do_stream(iter, &1, &2)
end
defp do_stream(iter = Iterator[type: :ref], acc, fun) do
case :geef_ref.next(rebind(iter)) do
{:ok, ref} ->
do_stream(iter, fun.(Reference.from_erl(ref), acc), fun)
{:error, :iterover} ->
acc
{:error, error} ->
raise Geef.IteratorError, message: error
end
end
end
defexception Geef.IteratorError, [message: nil]