Skip to content

Instantly share code, notes, and snippets.

@mehaase
Created December 9, 2021 17:51
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 mehaase/5f23a5c91481f54d4ca809cdbf29dfca to your computer and use it in GitHub Desktop.
Save mehaase/5f23a5c91481f54d4ca809cdbf29dfca to your computer and use it in GitHub Desktop.
Checkpoint iterators
class CheckpointIter:
def __init__(self):
self.checkpoints = list()
def every(self, n_items, do_this):
self.checkpoints.append((n_items, do_this))
def iter(self, iterable):
i = 1
for item in iterable:
yield item
for n, do_this in self.checkpoints:
if i % n == 0:
do_this(i)
i += 1
ci = CheckpointIter()
ci.every(10, lambda i: print("every 10: {}".format(i)))
ci.every(24, lambda i: print("every 24: {}".format(i)))
sum = 0
for x in ci.iter(range(100)):
sum += x
print("sum is {:,}".format(sum))
# every 10: 10
# every 10: 20
# every 24: 24
# every 10: 30
# every 10: 40
# every 24: 48
# every 10: 50
# every 10: 60
# every 10: 70
# every 24: 72
# every 10: 80
# every 10: 90
# every 24: 96
# every 10: 100
# sum is 4,950
class _Every:
def __init__(self, parent, n_items):
self.parent = parent
self.n_items = n_items
def do(self, fn):
self.parent._add_checkpoint(self.n_items, fn)
class CutesyCheckpointIter:
def __init__(self):
self.checkpoints = list()
def _add_checkpoint(self, n_items, do_this):
self.checkpoints.append((n_items, do_this))
def every(self, n_items):
return _Every(self, n_items)
def __call__(self, iterable):
i = 1
for item in iterable:
yield item
for n, do_this in self.checkpoints:
if i % n == 0:
do_this(i)
i += 1
cute = CutesyCheckpointIter()
cute.every(10).do(lambda i: print("cute 10: {}".format(i)))
cute.every(24).do(lambda i: print("cute 24: {}".format(i)))
sum = 0
for x in cute(range(100)):
sum += x
print("sum is {:,}".format(sum))
# cute 10: 10
# cute 10: 20
# cute 24: 24
# cute 10: 30
# cute 10: 40
# cute 24: 48
# cute 10: 50
# cute 10: 60
# cute 10: 70
# cute 24: 72
# cute 10: 80
# cute 10: 90
# cute 24: 96
# cute 10: 100
# sum is 4,950
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment