I have another python3 solution (read SICP chapter 3.5)
class Stream: def __init__(self, head, tail): self.head = head self.tail = tail self.memory = None self.isDone = False def car(self): return self.head def cdr(self): if self.isDone: return self.memory self.memory = self.tail() self.isDone = True return self.memory def __getitem__(self, pullFrom): if pullFrom < 1 or self.memory == []: return [] return [self.car()] + self.cdr()[pullFrom - 1] def __repr__(self): return "[" + repr(self.car()) + " x " + repr(self.tail) + "]" def map(self, func): if self.memory == []: return [] return Stream(func(self.car()), lambda: Stream.map(self.cdr(), func)) def from_list(lst): if lst == []: return [] return Stream(lst[0], lambda: Stream.from_list(lst[1:])) def filter(self, pred): if self.memory == []: return [] elif pred(self.car()): return Stream(self.car(), lambda: Stream.filter(self.cdr(), pred)) else: return self.cdr().filter(pred) def sieve(self): return Stream(self.car(), lambda: self.cdr().filter(lambda n: n % self.car() > 0).sieve()) def foreach(self, action, pull = None): if pull is None: action(self.car()) self.cdr().foreach(action, pull) elif pull <= 0: return else: action(self.car()) self.cdr().foreach(action, pull-1)and run: a = Stream(0, lambda: a.map((lambda x: x + 1))) print(a[10])
which returns: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] .
But threads are lazily evaluated, therefore:
>>> a = Stream(0, lambda: a.map((lambda x: x + 1))) >>> print(a)
prints:
[0 x [...]]
source share