68 lines
1.4 KiB
GDScript3
Raw Normal View History

2024-12-27 21:00:07 +01:00
static func sample_observable(
source : Observable, sampler : Observable
) -> Observable:
var subscribe = func(
observer : ObserverBase,
scheduler : SchedulerBase = null
) -> DisposableBase:
var at_end = RefValue.Set(false)
var has_value = RefValue.Set(false)
var value = RefValue.Null()
var sample_subscribe = func(__ = null):
if has_value.v:
has_value.v = false
observer.on_next(value.v)
if at_end.v:
observer.on_completed()
var on_next = func(new_value):
has_value.v = true
value.v = new_value
var on_completed = func():
at_end.v = true
return CompositeDisposable.new([
source.subscribe(
on_next, observer.on_error, on_completed,
scheduler
),
sampler.subscribe(
sample_subscribe,
observer.on_error,
sample_subscribe,
scheduler
)
])
return Observable.new(subscribe)
static func sample_(
sampler : Observable,
sampler_time : float = NAN,
scheduler : SchedulerBase = null
) -> Callable:
# """Samples the observable sequence at each interval.
#
# Examples:
# >>> var res = sample.call(source)
#
# Args:
# source: Source sequence to sample.
#
# Returns:
# Sampled observable sequence.
# """
var sample = func(source : Observable) -> Observable:
if sampler_time != NAN:
return sample_observable(
source, GDRx.obs.interval(sampler_time, scheduler)
)
else:
return sample_observable(source, sampler)
return sample