TestGame/addons/reactivex/observer/autodetachobserver.gd
2024-12-31 20:20:00 +01:00

73 lines
1.4 KiB
GDScript

extends ObserverBase
class_name AutoDetachObserver
var _on_next : Callable
var _on_error : Callable
var _on_completed : Callable
var _subscription : SingleAssignmentDisposable
var is_stopped : bool
var this : AutoDetachObserver
func _init(
on_next_ : Callable = GDRx.basic.noop,
on_error_ : Callable = GDRx.basic.noop,
on_completed_ : Callable = GDRx.basic.noop):
this = self
this.unreference()
self._on_next = on_next_
self._on_error = on_error_
self._on_completed = on_completed_
self._subscription = SingleAssignmentDisposable.new()
self.is_stopped = false
func on_next(i):
if self.is_stopped:
return
self._on_next.call(i)
func on_error(e):
if self.is_stopped:
return
self.is_stopped = true
GDRx.try(func():
self._on_error.call(e)
).end_try_catch()
self.dispose()
func on_completed():
if self.is_stopped:
return
self.is_stopped = true
GDRx.try(func():
self._on_completed.call()
).end_try_catch()
self.dispose()
func set_disposable(value : DisposableBase):
self._subscription.disposable = value
var subscription: set = set_disposable
func dispose():
this.is_stopped = true
this._subscription.dispose()
func fail(err) -> bool:
if self.is_stopped:
return false
self.is_stopped = true
self._on_error.call(err)
return true
func _notification(what):
if what == NOTIFICATION_PREDELETE:
this.dispose()