class Enumerable: def __init__(self, func): self.func = func def select(self, func): def inner(func): for item in self.func(): yield func(item) return Enumerable(lambda: inner(func)) def where(self, func): def inner(func): for item in self.func(): if func(item): yield item return Enumerable(lambda: inner(func)) def join(self,stream): def inner(stream): for left in self.func(): for right in stream.func(): yield (left, right) return Enumerable(lambda: inner(stream)) def take(self, count): def inner(count): iterator = self.func() for counter in xrange(count): yield iterator.next() return Enumerable(lambda: inner(count)) def skip(self, count): def inner(count): iterator = self.func() for counter in xrange(count): iterator.next() while True: yield iterator.next() return Enumerable(lambda: inner(count)) def __iter__(self): return self.func() def iterate(initialValue, func): while True: yield initialValue initialValue = func(initialValue) def ezip(enum1, enum2): def inner(e1, e2): i1 = e1.__iter__() i2 = e2.__iter__() while True: yield (i1.next(), i2.next()) return Enumerable(lambda: inner(enum1,enum2)) ############################################################################### def fibs(): yield 0 yield 1 fibsEnum = Enumerable(fibs) for value in ezip(fibsEnum, fibsEnum.skip(1)).select(lambda item: item[0] + item[1]): yield value if __name__ == "__main__": fs = Enumerable(fibs) fs = fs.take(10) print list(fs)