From 674ff19aef43a504539090123db37451a7257226 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Piotr=20Ma=C5=9Blanka?= <piotr.maslanka@henrietta.com.pl>
Date: Mon, 30 Nov 2020 19:49:21 +0100
Subject: [PATCH] fix iterators

---
 docs/usage.rst        |  5 +++++
 tempsdb/iterators.pyx | 20 ++++++++++++--------
 2 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/docs/usage.rst b/docs/usage.rst
index fdc9540..ecd4b2e 100644
--- a/docs/usage.rst
+++ b/docs/usage.rst
@@ -14,3 +14,8 @@ Then you can create and retrieve particular series:
 
 .. autoclass:: tempsdb.series.TimeSeries
     :members:
+
+You retrieve their data via Iterators:
+
+.. autoclass:: tempsdb.iterators.Iterator
+    :members:
diff --git a/tempsdb/iterators.pyx b/tempsdb/iterators.pyx
index 70aa8aa..0a3e9a3 100644
--- a/tempsdb/iterators.pyx
+++ b/tempsdb/iterators.pyx
@@ -72,24 +72,28 @@ cdef class Iterator:
         return 0
 
     def __next__(self) -> tp.Tuple[int, bytes]:
-        return self.next()
+        cdef tuple tpl = self.next()
+        if tpl is None:
+            raise StopIteration()
+        return tpl
 
     cpdef tuple next(self):
         """
-        Return next element
+        Return next element or None, if list was exhausted
         
         :return: next element
-        :rtype: tp.Tuple[int, bytes]
+        :rtype: tp.Optional[tp.Tuple[int, bytes]]
         """
-        if self.current_chunk is None:
-            self.get_next()
-        if self.i == self.limit:
-            self.get_next()
         try:
+            if self.current_chunk is None:
+                self.get_next()
+            if self.i == self.limit:
+                self.get_next()
             return self.current_chunk.get_piece_at(self.i)
+        except StopIteration:
+            return None
         finally:
             self.i += 1
 
     def __iter__(self) -> Iterator:
         return self
-
-- 
GitLab