TestGame/addons/reactivex/observer/autodetachobserver.gd

73 lines
1.4 KiB
GDScript3
Raw Permalink Normal View History

2024-12-27 21:00:07 +01:00
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(
2024-12-31 20:20:00 +01:00
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
2024-12-27 21:00:07 +01:00
func on_next(i):
2024-12-31 20:20:00 +01:00
if self.is_stopped:
return
self._on_next.call(i)
2024-12-27 21:00:07 +01:00
func on_error(e):
2024-12-31 20:20:00 +01:00
if self.is_stopped:
return
self.is_stopped = true
GDRx.try(func():
self._on_error.call(e)
).end_try_catch()
self.dispose()
2024-12-27 21:00:07 +01:00
func on_completed():
2024-12-31 20:20:00 +01:00
if self.is_stopped:
return
self.is_stopped = true
GDRx.try(func():
self._on_completed.call()
).end_try_catch()
self.dispose()
2024-12-27 21:00:07 +01:00
func set_disposable(value : DisposableBase):
2024-12-31 20:20:00 +01:00
self._subscription.disposable = value
2024-12-27 21:00:07 +01:00
var subscription: set = set_disposable
func dispose():
2024-12-31 20:20:00 +01:00
this.is_stopped = true
this._subscription.dispose()
2024-12-27 21:00:07 +01:00
func fail(err) -> bool:
2024-12-31 20:20:00 +01:00
if self.is_stopped:
return false
self.is_stopped = true
self._on_error.call(err)
return true
2024-12-27 21:00:07 +01:00
func _notification(what):
2024-12-31 20:20:00 +01:00
if what == NOTIFICATION_PREDELETE:
this.dispose()