""" Utilities for event-driven programming. $Id$ Copyright (C) 2009 Internet Systems Consortium ("ISC") Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. """ import rpki.log class iterator(object): """Iteration construct for event-driven code. Takes three arguments: - Some kind of iterable object - A callback to call on each item in the iteration - A callback to call after the iteration terminates. The item callback receives two arguments: the callable iterator object and the current value of the iteration. It should call the iterator (or arrange for the iterator to be called) when it is time to continue to the next item in the iteration. The termination callback receives no arguments. """ def __init__(self, iterable, item_callback, done_callback): self.item_callback = item_callback self.done_callback = done_callback try: self.iterator = iter(iterable) except: rpki.log.debug("Problem constructing iterator for %s" % repr(iterable)) raise self() def __call__(self, *ignored): try: self.item_callback(self, self.iterator.next()) except StopIteration: if self.done_callback is not None: self.done_callback()