40
40
)
41
41
42
42
import attr
43
- from typing_extensions import ContextManager
43
+ from typing_extensions import ContextManager , Literal
44
44
45
45
from twisted .internet import defer
46
46
from twisted .internet .defer import CancelledError
@@ -96,6 +96,10 @@ class ObservableDeferred(Generic[_T], AbstractObservableDeferred[_T]):
96
96
97
97
__slots__ = ["_deferred" , "_observers" , "_result" ]
98
98
99
+ _deferred : "defer.Deferred[_T]"
100
+ _observers : Union [List ["defer.Deferred[_T]" ], Tuple [()]]
101
+ _result : Union [None , Tuple [Literal [True ], _T ], Tuple [Literal [False ], Failure ]]
102
+
99
103
def __init__ (self , deferred : "defer.Deferred[_T]" , consumeErrors : bool = False ):
100
104
object .__setattr__ (self , "_deferred" , deferred )
101
105
object .__setattr__ (self , "_result" , None )
@@ -158,12 +162,14 @@ def observe(self) -> "defer.Deferred[_T]":
158
162
effect the underlying deferred.
159
163
"""
160
164
if not self ._result :
165
+ assert isinstance (self ._observers , list )
161
166
d : "defer.Deferred[_T]" = defer .Deferred ()
162
167
self ._observers .append (d )
163
168
return d
169
+ elif self ._result [0 ]:
170
+ return defer .succeed (self ._result [1 ])
164
171
else :
165
- success , res = self ._result
166
- return defer .succeed (res ) if success else defer .fail (res )
172
+ return defer .fail (self ._result [1 ])
167
173
168
174
def observers (self ) -> "Collection[defer.Deferred[_T]]" :
169
175
return self ._observers
@@ -175,6 +181,8 @@ def has_succeeded(self) -> bool:
175
181
return self ._result is not None and self ._result [0 ] is True
176
182
177
183
def get_result (self ) -> Union [_T , Failure ]:
184
+ if self ._result is None :
185
+ raise ValueError (f"{ self !r} has no result yet" )
178
186
return self ._result [1 ]
179
187
180
188
def __getattr__ (self , name : str ) -> Any :
0 commit comments