2024-12-27 21:00:07 +01:00

112 lines
3.3 KiB
GDScript

extends Comparable
class_name Notification
## Represents a notification to an observer.
var has_value : bool
var value
var kind : String
## Default constructor used by derived types.
func _init():
self.has_value = false
self.value = null
self.kind = ""
## Invokes the delegate corresponding to the notification or an
## observer and returns the produced result.
## [br]
## [b]Examples:[/b]
## [codeblock]
## notification.accept(observer)
## notification.accept(on_next, on_error, on_completed)
## [/codeblock]
## [br]
## [b]Args:[/b]
## [br]
## [code]on_next[/code] Delegate to invoke for an OnNext notification.
## [br]
## [code]on_error[/code] [Optional] Delegate to invoke for an OnError
## notification.
## [br]
## [code]on_completed[/code] [Optional] Delegate to invoke for an
## OnCompleted notification.
## [br][br]
## [b]Returns:[/b]
## [br]
## Result produced by the observation.
func accept(
on_next, # Callable or ObserverBase
on_error : Callable = GDRx.basic.noop,
on_completed : Callable = GDRx.basic.noop):
if on_next is ObserverBase:
return self._accept_observer(on_next)
return self._accept(on_next, on_error, on_completed)
func _accept(
_on_next : Callable,
_on_error : Callable = GDRx.basic.noop,
_on_completed : Callable = GDRx.basic.noop):
NotImplementedError.raise()
func _accept_observer(_observer : ObserverBase):
NotImplementedError.raise()
## Returns an observable sequence with a single notification,
## using the specified scheduler, else the immediate scheduler.
## [br]
## [b]Args:[/b]
## [br]
## [code]scheduler[/code] [Optional] Scheduler to send out the
## notification calls on.
## [br][br]
## [b]Returns:[/b]
## [br]
## An observable sequence that surfaces the behavior of the
## notification upon subscription.
func to_observable(scheduler : SchedulerBase = null) -> ObservableBase:
var _scheduler = scheduler if scheduler != null else ImmediateScheduler.singleton()
var subscribe = func(observer : ObserverBase, scheduler : SchedulerBase = null) -> DisposableBase:
var action = func(_scheduler : SchedulerBase, _state):
self._accept_observer(observer)
if self.kind == "N":
observer.on_completed()
var __scheduler = scheduler if scheduler != null else _scheduler
return __scheduler.schedule(action)
return Observable.new(subscribe)
## Indicates whether this instance and a specified object are equal.
func equals(other : Notification) -> bool:
var other_string = "" if other == null else str(other)
return str(self) == other_string
## Inherited from [Comparable]
func eq(other) -> bool:
if not (other is Notification):
return false
return self.equals(other)
## Creates an observer from a notification callback.
## [br]
## [b]Args:[/b]
## [br]
## [code]handler[/code] Action that handles a notification.
## [br][br]
## [b]Returns:[/b]
## [br]
## The observer object that invokes the specified handler using
## a notification corresponding to each message it receives.
static func from_notifier(handler : Callable) -> Observer:
var _on_next = func(value_):
return handler.call(GDRx.OnNext.new(value_))
var _on_error = func(err_):
return handler.call(GDRx.OnError.new(err_))
var _on_completed = func():
return handler.call(GDRx.OnCompleted.new())
return Observer.new(_on_next, _on_error, _on_completed)