diff --git a/bin/iteratortools.py b/bin/iteratortools.py
index f3d93096d769d1f63e381d966d48162d188b5e83..382d164f57c4ae946a065c9c174593042590d5ab 100644
--- a/bin/iteratortools.py
+++ b/bin/iteratortools.py
@@ -17,22 +17,6 @@ class Iterate:
 
 
 
-class FileIterator:
-    def __init__(self, file):
-        self.file = file
-
-    def __iter__(self):
-        return self
-
-    def next(self):
-        l = self.file.readline()
-        if l=='':
-            raise StopIteration
-        return l
-
-
-
-
 class BufferedIterator:
 
     def __init__(self, it, size=1):
@@ -79,90 +63,47 @@ class BufferedIterator:
 
 
 
+def FileIterator(file):
+    l = file.readline()
+    while (l!=''):
+        yield l
+        l = file.readline()
 
-class UntilIterator:
 
-    def __init__(self, it, stop, withLast=True):
-        self.it = it
-        self.stop = stop
-        self.withLast = withLast
-        self.stoped = False
 
-    def __iter__(self):
-        return self
-
-    def next(self):
-        if self.stoped:
-            raise StopIteration
-
-        try:
-            item = self.it.next()
-        except StopIteration:
-            self.stoped = True
-            raise StopIteration
-
-        if self.stop(item):
-            self.stoped = True
-            if self.withLast:
-                return item
+def UntilIterator(it, stop, withLast=True):
+    while (True):
+        item = it.next()
+        if (stop(item)):
+            if (withLast):
+                yield item
             else:
-                self.it.back()
-            raise StopIteration
-        return item
-
-
-
-
-class FilterIterator:
-
-    def __init__(self, it, include, mutate=(lambda x:x)):
-        self.mutate=mutate
-        self.include=include
-        self.it = it
-        self.stoped = False
-
-    def __iter__(self):
-        return self
-
-    def next(self):
-        if self.stoped:
-            raise StopIteration
-
-        try:
-            item = self.it.next()
-            while not(self.include(item)):
-                item = self.it.next()
-            return self.mutate(item)
-        except StopIteration:
-            self.stoped = True
-            raise StopIteration
+                it.back()
+            return
+        yield item
 
 
 
+def FilterIterator(it, include, mutate=(lambda x:x)):
+    while (True):
+        item = it.next()
+        if (include(item)):
+            yield mutate(item)
 
-class HierarchyIterator:
 
-    def __init__(self, it, up, down, hideupdown=False):
-        self.it = it
-        self.up = up
-        self.down = down
-        self.hideupdown = hideupdown
-        self.level = 0
 
-    def __iter__(self):
-        return self
+def HierarchyIterator(it, up, down, hideupdown=False):
+    level = 0
+    while (True):
+        item = it.next()
+        upItem = up(item)
+        downItem = down(item)
+        if (upItem):
+            level += 1
+        if (not hideupdown) or ((not upItem) and (not downItem)):
+            yield (item, level)
+        if (downItem):
+            level -= 1
+            if level < 0:
+                level = 0
 
-    def next(self):
-        item = self.it.next()
-        if self.up(item):
-            self.level += 1
-            if (self.hideupdown):
-                return self.next()
-        r = (item, self.level)
-        if self.down(item):
-            self.level -= 1
-            if self.level < 0:
-                self.level = 0
-            if (self.hideupdown):
-                return self.next()
-        return r