TestGame/addons/reactivex/scheduler/periodicscheduler.gd

70 lines
2.0 KiB
GDScript3
Raw Normal View History

2024-12-27 21:00:07 +01:00
extends PeriodicSchedulerBase
class_name PeriodicScheduler
const UTC_ZERO : float = Scheduler.UTC_ZERO
const DELTA_ZERO : float = Scheduler.DELTA_ZERO
## Represents a notion of time for this scheduler. Tasks being
## scheduled on a scheduler will adhere to the time denoted by this
## property.
## [br]
## [b]Returns:[/b]
## [br]
## The scheduler's current time, as a datetime instance.
func now() -> float:
return GDRx.basic.default_now()
## Invoke the given given action. This is typically called by instances
## of [ScheduledItem].
## [br]
## [b]Args:[/b]
## [br]
## [code]action[/code] Action to be executed.
## [br]
## [code]state[/code] [Optional] state to be given to the action function.
## [br][br]
## [b]Returns:[/b]
## [br]
## The disposable object returned by the action, if any; or a new
## (no-op) disposable otherwise.
func invoke_action(action : Callable, state = null) -> DisposableBase:
var ret = action.call(self, state)
if ret is DisposableBase:
return ret
return Disposable.new()
## Schedule a periodic action for repeated execution every time
## [code]period[/code] seconds have expired.
func schedule_periodic(
period : float,
action : Callable,
state = null) -> DisposableBase:
var disp : MultipleAssignmentDisposable = MultipleAssignmentDisposable.new()
var seconds : float = period
var periodic : Callable = func(scheduler : SchedulerBase, state = null, periodic_ : Callable = func(__, ___, ____): return) -> Disposable:
if disp.is_disposed:
return null
var _now : float = scheduler.now()
var state_res = RefValue.Null()
if not GDRx.try(func():
state_res.v = action.call(state)
) \
.catch("Error", func(err):
disp.dispose()
GDRx.raise(err)
) \
.end_try_catch(): state = state_res.v
var time = seconds - (scheduler.now() - _now)
disp.disposable = scheduler.schedule_relative(time, periodic_.bind(periodic_), state)
return null
periodic = periodic.bind(periodic)
disp.disposable = self.schedule_relative(period, periodic, state)
return disp