73 lines
1.3 KiB
GDScript3
73 lines
1.3 KiB
GDScript3
|
|
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()
|