1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
"""
A general way to flatten deeply recursive algorithms by delaying some
parts until later.
"""
try:
from thread import _local as TlsClass
except ImportError:
class TlsClass(object):
pass
class FlattenRecursion(TlsClass):
def __init__(self):
self.later = None
def __call__(self, func, *args, **kwds):
"""Call func(*args, **kwds), either now, or, if we're recursing,
then the call will be done later by the first level.
"""
if self.later is not None:
self.later.append((func, args, kwds))
else:
self.later = lst = []
try:
func(*args, **kwds)
for func, args, kwds in lst:
func(*args, **kwds)
finally:
self.later = None
|