From 1f7e41995bbb9530ad91ed21ad89bb2d0d4d923d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Sat, 10 Aug 2013 20:44:28 +0200 Subject: [PATCH] Allow streaming from an iterator --- lib/geef/iterator.ex | 29 +++++++++++++++++++++++++++++ lib/geef/reference.ex | 9 +++++++++ 2 files changed, 38 insertions(+) create mode 100644 lib/geef/iterator.ex diff --git a/lib/geef/iterator.ex b/lib/geef/iterator.ex new file mode 100644 index 0000000..1777504 --- /dev/null +++ b/lib/geef/iterator.ex @@ -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] diff --git a/lib/geef/reference.ex b/lib/geef/reference.ex index e7d9dc9..492db49 100644 --- a/lib/geef/reference.ex +++ b/lib/geef/reference.ex @@ -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