105 lines
3.9 KiB
GDScript
105 lines
3.9 KiB
GDScript
static func observable_timer_date(duetime : float, scheduler : SchedulerBase = null) -> Observable:
|
|
var subscribe = func(observer : ObserverBase, scheduler_ : SchedulerBase = null) -> DisposableBase:
|
|
var _scheduler : SchedulerBase = null
|
|
if scheduler != null: _scheduler = scheduler
|
|
elif scheduler_ != null: _scheduler = scheduler_
|
|
else: _scheduler = SceneTreeTimeoutScheduler.singleton()
|
|
|
|
var action = func(_scheduler : SchedulerBase, _state):
|
|
observer.on_next(0)
|
|
observer.on_completed()
|
|
|
|
return _scheduler.schedule_absolute(duetime, action)
|
|
|
|
return Observable.new(subscribe)
|
|
|
|
static func observable_timer_duetime_and_period(duetime : float, time_absolute : bool, period : float, scheduler : SchedulerBase = null) -> Observable:
|
|
var duetime_ref = RefValue.Set(duetime)
|
|
var subscribe = func(observer : ObserverBase, scheduler_ : SchedulerBase = null) -> DisposableBase:
|
|
var _scheduler : SchedulerBase = null
|
|
if scheduler != null: _scheduler = scheduler
|
|
elif scheduler_ != null: _scheduler = scheduler_
|
|
else: _scheduler = SceneTreeTimeoutScheduler.singleton()
|
|
|
|
if not time_absolute:
|
|
duetime_ref.v = _scheduler.now() + duetime_ref.v
|
|
|
|
var p = max(0.0, period)
|
|
var mad = MultipleAssignmentDisposable.new()
|
|
var dt = RefValue.Set(duetime_ref.v)
|
|
var count = RefValue.Set(0)
|
|
|
|
var action = func(scheduler : SchedulerBase, _state, action_):
|
|
if p > 0.0:
|
|
var now = scheduler.now()
|
|
dt.v = dt.v + p
|
|
if dt.v <= now:
|
|
dt.v = now + p
|
|
|
|
observer.on_next(count.v)
|
|
count.v += 1
|
|
mad.disposable = scheduler.schedule_absolute(dt.v, action_.bind(action_))
|
|
action = action.bind(action)
|
|
|
|
mad.disposable = _scheduler.schedule_absolute(dt.v, action)
|
|
return mad
|
|
|
|
return Observable.new(subscribe)
|
|
|
|
static func observable_timer_timespan(duetime : float, scheduler : SchedulerBase = null) -> Observable:
|
|
var subscribe = func(observer : ObserverBase, scheduler_ : SchedulerBase = null) -> DisposableBase:
|
|
var _scheduler : SchedulerBase = null
|
|
if scheduler != null: _scheduler = scheduler
|
|
elif scheduler_ != null: _scheduler = scheduler_
|
|
else: _scheduler = SceneTreeTimeoutScheduler.singleton()
|
|
var d : float = duetime
|
|
|
|
var action = func(_scheduler : SchedulerBase, _state):
|
|
observer.on_next(0)
|
|
observer.on_completed()
|
|
|
|
if d <= 0.0:
|
|
return _scheduler.schedule(action)
|
|
return _scheduler.schedule_relative(d, action)
|
|
|
|
return Observable.new(subscribe)
|
|
|
|
static func observable_timer_timespan_and_period(duetime : float, period : float, scheduler : SchedulerBase = null) -> Observable:
|
|
if duetime == period:
|
|
|
|
var subscribe = func(observer : ObserverBase, scheduler_ : SchedulerBase = null) -> DisposableBase:
|
|
var _scheduler : SchedulerBase = null
|
|
if scheduler != null: _scheduler = scheduler
|
|
elif scheduler_ != null: _scheduler = scheduler_
|
|
else: _scheduler = SceneTreeTimeoutScheduler.singleton()
|
|
|
|
var action = func(count = null):
|
|
if count != null:
|
|
observer.on_next(count)
|
|
return count + 1
|
|
return null
|
|
|
|
if not _scheduler is PeriodicScheduler:
|
|
BadArgumentError.new(
|
|
"Scheduler must be PeriodicScheduler").throw()
|
|
return Disposable.new()
|
|
var periodic_scheduler : PeriodicScheduler = _scheduler
|
|
return periodic_scheduler.schedule_periodic(period, action, 0)
|
|
|
|
return Observable.new(subscribe)
|
|
return observable_timer_duetime_and_period(duetime, false, period, scheduler)
|
|
|
|
static func timer_(duetime : float, time_absolute : bool, period = null, scheduler : SchedulerBase = null) -> Observable:
|
|
if time_absolute:
|
|
if period == null:
|
|
return observable_timer_date(duetime, scheduler)
|
|
else:
|
|
var fperiod : float = period
|
|
return observable_timer_duetime_and_period(duetime, true, fperiod, scheduler)
|
|
|
|
if period == null:
|
|
return observable_timer_timespan(duetime, scheduler)
|
|
|
|
var fperiod : float = period
|
|
return observable_timer_timespan_and_period(duetime, fperiod, scheduler)
|