Allow streaming from an iterator
This commit is contained in:
29
lib/geef/iterator.ex
Normal file
29
lib/geef/iterator.ex
Normal 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]
|
||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user