Allow streaming from an iterator

This commit is contained in:
Carlos Martín Nieto
2013-08-10 20:44:28 +02:00
parent aaf6a3c6e3
commit 1f7e41995b
2 changed files with 38 additions and 0 deletions

29
lib/geef/iterator.ex Normal file
View File

@@ -0,0 +1,29 @@
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
def stream(iter = Iterator[]) do
&stream(iter, &1, &2)
end
def stream(iter = Iterator[type: ref], acc, fun) do
case :geef_ref.next(rebind(iter)) do
{:ok, ref} ->
stream(iter, fun.(Reference.new(ref), acc), fun)
{:error, :iterover} ->
acc
{:error, error} ->
raise Geef.IteratorError, message: error
end
end
end
defexception Geef.IteratorError, [message: nil]

View File

@@ -31,4 +31,13 @@ defrecord Geef.Reference, Record.extract(:geef_reference, from: "src/geef_record
:geef_ref.shorthand(name) :geef_ref.shorthand(name)
end end
def iterator(repo, regexp // :undefined) do
case :geef_ref.iterator(repo, regexp) do
{:ok, iter} ->
{:ok, Geef.Iterator.new iter}
other ->
other
end
end
end end