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)
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user