Package baxter_dataflow :: Module signals
[hide private]
[frames] | no frames]

Source Code for Module baxter_dataflow.signals

 1  # Copyright (c) 2013-2015, Rethink Robotics 
 2  # All rights reserved. 
 3  # 
 4  # Redistribution and use in source and binary forms, with or without 
 5  # modification, are permitted provided that the following conditions are met: 
 6  # 
 7  # 1. Redistributions of source code must retain the above copyright notice, 
 8  #    this list of conditions and the following disclaimer. 
 9  # 2. Redistributions in binary form must reproduce the above copyright 
10  #    notice, this list of conditions and the following disclaimer in the 
11  #    documentation and/or other materials provided with the distribution. 
12  # 3. Neither the name of the Rethink Robotics nor the names of its 
13  #    contributors may be used to endorse or promote products derived from 
14  #    this software without specific prior written permission. 
15  # 
16  # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
17  # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
18  # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
19  # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
20  # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
21  # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
22  # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
23  # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
24  # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
25  # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
26  # POSSIBILITY OF SUCH DAMAGE. 
27   
28  import inspect 
29  from weakref import WeakKeyDictionary 
30   
31  try: 
32      from weakref import WeakSet 
33  except ImportError: 
34      from weakrefset import WeakSet 
35   
36   
37 -class Signal(object):
38 - def __init__(self):
39 self._functions = WeakSet() 40 self._methods = WeakKeyDictionary()
41
42 - def __call__(self, *args, **kargs):
43 for f in self._functions: 44 f(*args, **kargs) 45 46 for obj, functions in self._methods.items(): 47 for f in functions: 48 f(obj, *args, **kargs)
49
50 - def connect(self, slot):
51 if inspect.ismethod(slot): 52 if not slot.__self__ in self._methods: 53 self._methods[slot.__self__] = set() 54 self._methods[slot.__self__].add(slot.__func__) 55 else: 56 self._functions.add(slot)
57
58 - def disconnect(self, slot):
59 if inspect.ismethod(slot): 60 if slot.__self__ in self._methods: 61 self._methods[slot.__self__].remove(slot.__func__) 62 else: 63 if slot in self._functions: 64 self._functions.remove(slot)
65