summary refs log tree commit diff
path: root/synapse/util
diff options
context:
space:
mode:
authorErik Johnston <erik@matrix.org>2019-10-11 15:26:09 +0100
committerErik Johnston <erik@matrix.org>2019-10-11 15:26:09 +0100
commit3c2d6c708cd93df7fc945e10014049e9f9b36f46 (patch)
treefe45c9c825d9db33ec4fd50f57f6cf1b0a02f6e1 /synapse/util
parentNewsfile (diff)
downloadsynapse-3c2d6c708cd93df7fc945e10014049e9f9b36f46.tar.xz
Add maybe_awaitable and fix __init__ bugs
Diffstat (limited to 'synapse/util')
-rw-r--r--synapse/util/async_helpers.py29
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)