7 self.counter = itertools.count()
8 def get(self, key, default=None):
10 x, value = self.inner[key]
11 self.inner[key] = self.counter.next(), value
14 def __setitem__(self, key, value):
15 self.inner[key] = self.counter.next(), value
16 while len(self.inner) > self.n:
17 self.inner.pop(min(self.inner, key=lambda k: self.inner[k][0]))
21 def memoize_with_backing(backing, has_inverses=set()):
24 res = backing.get((f, args), _nothing)
25 if res is not _nothing:
30 backing[(f, args)] = res
31 for inverse in has_inverses:
32 backing[(inverse, args[:-1] + (res,))] = args[-1]
39 return memoize_with_backing({})(f)