# -*- Mode: Python; tab-width: 4 -*-

# [ based on async_lib/consumer.py:function_chain.py ]

class continuation:

	'Package up a continuation as an object.'
	'Also a convenient place to store state.'

	def __init__ (self, fun, *args):
		self.funs = [(fun, args)]

	def __call__ (self, *args):
		fun, init_args = self.funs[0]
		self.funs = self.funs[1:]
		if self.funs:
			apply (fun, (self,)+ init_args + args)
		else:
			apply (fun, init_args + args)

	def chain (self, fun, *args):
		self.funs.insert (0, (fun, args))
		return self

	def abort (self, *args):
		fun, init_args = self.funs[-1]
		apply (fun, init_args + args)
