diff options
author | Erik Johnston <erik@matrix.org> | 2019-10-11 15:26:09 +0100 |
---|---|---|
committer | Erik Johnston <erik@matrix.org> | 2019-10-11 15:26:09 +0100 |
commit | 3c2d6c708cd93df7fc945e10014049e9f9b36f46 (patch) | |
tree | fe45c9c825d9db33ec4fd50f57f6cf1b0a02f6e1 /synapse/util | |
parent | Newsfile (diff) | |
download | synapse-3c2d6c708cd93df7fc945e10014049e9f9b36f46.tar.xz |
Add maybe_awaitable and fix __init__ bugs
Diffstat (limited to 'synapse/util')
-rw-r--r-- | synapse/util/async_helpers.py | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/synapse/util/async_helpers.py b/synapse/util/async_helpers.py index 0d3bdd88ce..804dbca443 100644 --- a/synapse/util/async_helpers.py +++ b/synapse/util/async_helpers.py @@ -21,6 +21,8 @@ from typing import Dict, Sequence, Set, Union from six.moves import range +import attr + from twisted.internet import defer from twisted.internet.defer import CancelledError from twisted.python import failure @@ -483,3 +485,30 @@ def timeout_deferred(deferred, timeout, reactor, on_timeout_cancel=None): deferred.addCallbacks(success_cb, failure_cb) return new_d + + +@attr.s(slots=True, frozen=True) +class DoneAwaitable(object): + """Simple awaitable that returns the provided value. + """ + + value = attr.ib() + + def __await__(self): + return self + + def __iter__(self): + return self + + def __next__(self): + raise StopIteration(self.value) + + +def maybe_awaitable(value): + """Convert a value to an awaitable if not already an awaitable. + """ + + if hasattr(value, "__await__"): + return value + + return DoneAwaitable(value) |