diff options
Diffstat (limited to 'BitTorrent/defer.py')
-rw-r--r-- | BitTorrent/defer.py | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/BitTorrent/defer.py b/BitTorrent/defer.py new file mode 100644 index 0000000..4531271 --- /dev/null +++ b/BitTorrent/defer.py @@ -0,0 +1,56 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +class Deferred(object): + def __init__(self): + self.callbacks = [] + self.errbacks = [] + self.calledBack = False + self.erredBack = False + self.results = [] + self.failures = [] + + def addCallback(self, cb, args=(), kwargs={}): + assert callable(cb) + self.callbacks.append((cb, args, kwargs)) + if self.calledBack: + self.doCallbacks(self.results, [(cb, args, kwargs)]) + return self + + def addErrback(self, cb, args=(), kwargs={}): + assert callable(cb) + self.errbacks.append((cb, args, kwargs)) + if self.erredBack: + self.doCallbacks(self.failures, [(cb, args, kwargs)]) + return self + + def addCallbacks(self, cb, eb, args=(), kwargs={}, + ebargs=(), ebkwargs={}): + assert callable(cb) + assert callable(eb) + self.addCallback(cb, args, kwargs) + self.addErrback(eb, ebargs, ebkwargs) + + def callback(self, result): + self.results.append(result) + self.calledBack = True + if self.callbacks: + self.doCallbacks([result], self.callbacks) + + def errback(self, failed): + self.failures.append(failed) + self.erredBack = True + if self.errbacks: + self.doCallbacks([failed], self.errbacks) + + def doCallbacks(self, results, callbacks): + for result in results: + for cb, args, kwargs in callbacks: + result = cb(result, *args, **kwargs) |