84 lines
2.0 KiB
GDScript3
84 lines
2.0 KiB
GDScript3
|
|
extends Subject
|
||
|
|
class_name AsyncSubject
|
||
|
|
|
||
|
|
## Represents the result of an asynchronous operation.
|
||
|
|
##
|
||
|
|
## The last value before the close notification, or the error received through
|
||
|
|
## [i]on_error[/i], is sent to all subscribed observers.
|
||
|
|
|
||
|
|
var value
|
||
|
|
var has_value : bool
|
||
|
|
|
||
|
|
## Creates a subject that can only receive one value and that value is
|
||
|
|
## cached for all future observations.
|
||
|
|
func _init():
|
||
|
|
super._init()
|
||
|
|
|
||
|
|
self.value = null
|
||
|
|
self.has_value = false
|
||
|
|
|
||
|
|
func _subscribe_core(
|
||
|
|
observer : ObserverBase,
|
||
|
|
_scheduler : SchedulerBase = null,
|
||
|
|
) -> DisposableBase:
|
||
|
|
if true:
|
||
|
|
var __ = LockGuard.new(self.lock)
|
||
|
|
if not check_disposed(): return Disposable.new()
|
||
|
|
if not self.is_stopped:
|
||
|
|
self.observers.append(observer)
|
||
|
|
return InnerSubscription.new(self, observer)
|
||
|
|
|
||
|
|
var err = self.error_value
|
||
|
|
var has_value_ = self.has_value
|
||
|
|
var value_ = self.value
|
||
|
|
|
||
|
|
if err != null:
|
||
|
|
observer.on_error(err)
|
||
|
|
elif has_value_:
|
||
|
|
observer.on_next(value_)
|
||
|
|
observer.on_completed()
|
||
|
|
else:
|
||
|
|
observer.on_completed()
|
||
|
|
|
||
|
|
return Disposable.new()
|
||
|
|
|
||
|
|
## Remember the value. Upon completion, the most recently received value
|
||
|
|
## will be passed on to all subscribed observers.
|
||
|
|
## [br][br]
|
||
|
|
## [b]Args:[/b]
|
||
|
|
## [br]
|
||
|
|
## [code]value[/code] The value to remember until completion
|
||
|
|
func _on_next_core(i):
|
||
|
|
var __ = LockGuard.new(self.lock)
|
||
|
|
self.value = i
|
||
|
|
self.has_value = true
|
||
|
|
|
||
|
|
## Notifies all subscribed observers of the end of the sequence. The
|
||
|
|
## most recently received value, if any, will now be passed on to all
|
||
|
|
## subscribed observers.
|
||
|
|
func _on_completed_core():
|
||
|
|
var observers_
|
||
|
|
var has_value_
|
||
|
|
var value_
|
||
|
|
|
||
|
|
if true:
|
||
|
|
var __ = LockGuard.new(self.lock)
|
||
|
|
observers_ = self.observers.duplicate()
|
||
|
|
self.observers.clear()
|
||
|
|
value_ = self.value
|
||
|
|
has_value_ = self.has_value
|
||
|
|
|
||
|
|
if has_value_:
|
||
|
|
for o in observers_:
|
||
|
|
o.on_next(value_)
|
||
|
|
o.on_completed()
|
||
|
|
else:
|
||
|
|
for o in observers_:
|
||
|
|
o.on_completed()
|
||
|
|
|
||
|
|
## Unsubscribe all observers and release resources.
|
||
|
|
func dispose():
|
||
|
|
var __ = LockGuard.new(self.lock)
|
||
|
|
self.value = null
|
||
|
|
super.dispose()
|