Skip to content

Instantly share code, notes, and snippets.

@SegFaultAX
Created March 7, 2015 09:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save SegFaultAX/520fe589dfe22ec10ae8 to your computer and use it in GitHub Desktop.
Save SegFaultAX/520fe589dfe22ec10ae8 to your computer and use it in GitHub Desktop.
Internal Iterators in Python
class Enumerable(object):
def map(self, fn):
acc = []
self.each(lambda xs: acc.append(fn(xs)))
return self.__class__(acc)
collect = map
def filter(self, pred):
acc = []
self.each(lambda xs: acc.append(xs) if pred(xs) else None)
return self.__class__(acc)
select = filter
def reduce(self, reducer, init=None):
s = object()
acc = { "v": s if init is None else init }
self.each(lambda xs: acc.__setitem__("v", xs) if acc["v"] is s else acc.__setitem__("v", reducer(acc["v"], xs)))
return acc["v"]
foldl = reduce
def count(self):
acc = { "v": 0 }
self.each(lambda _: acc.__setitem__("v", acc["v"]+1))
return acc["v"]
size = count
class MyList(Enumerable, list):
def each(self, fn):
for e in self:
fn(e)
return self
class MyDict(Enumerable, dict):
def each(self, fn):
for item in self.iteritems():
fn(item)
return self
d = MyDict({"a": 1, "b": 2})
l = MyList([1, 2, 3, 4])
print d.filter(lambda (k, v): v % 2 == 0).map(lambda (k, v): (k, v ** 2))
print l.filter(lambda e: e % 2 == 0).map(lambda e: e ** 2).foldl(lambda a, b: a + b, 20)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment