+
+
+class CoSwitch(object):
+ """
+ >>> apr = printer_sink("a %r")
+ >>> bpr = printer_sink("b %r")
+ >>> cs = CoSwitch(["a", "b"])
+ >>> cs.register_sink("a", apr)
+ >>> cs.register_sink("b", bpr)
+ >>> cs.stage.send(("a", 1, 2, 3))
+ a ('a', 1, 2, 3)
+ >>> cs.stage.send(("b", 1, 2, 3))
+ b ('b', 1, 2, 3)
+ >>> cs.stage.send(("b", 1, 2, 3))
+ b ('b', 1, 2, 3)
+ """
+
+ def __init__(self, signalKeys, key = (lambda eventData: eventData[0])):
+ self.stage = self._stage()
+ self._key = key
+ self._targets = {}
+
+ for signalKey in signalKeys:
+ self._targets[signalKey] = {}
+
+ def register_sink(self, signalKey, sink):
+ id = uuid.uuid4()
+ self._targets[signalKey][id] = sink
+ return id
+
+ def unregister_sink(self, signalKey, id):
+ del self._targets[signalKey][id]
+
+ def restart(self):
+ self.stage = self._stage()
+
+ @autostart
+ def _stage(self):
+ while True:
+ try:
+ item = yield