61 lines
1.7 KiB
GDScript3
Raw Permalink Normal View History

2024-12-27 21:00:07 +01:00
static func with_latest_from_(
parent : Observable, sources_
) -> Observable:
var sources : Array[Observable] = GDRx.util.unpack_arg(sources_)
var NO_VALUE = GDRx.util.NotSet.new()
var subscribe = func(
observer : ObserverBase,
scheduler : SchedulerBase = null
) -> DisposableBase:
var subscribeall = func(
parent : Observable, children : Array[Observable]
) -> Array[SingleAssignmentDisposable]:
var values = [] ; for __ in children: values.append(NO_VALUE)
var subscribechild = func(
i : int, child : Observable
) -> SingleAssignmentDisposable:
var subscription = SingleAssignmentDisposable.new()
var on_next = func(value):
var __ = LockGuard.new(parent.lock)
values[i] = value
subscription.disposable = child.subscribe(
on_next, observer.on_error, func(): return, scheduler
)
return subscription
var parent_subscription = SingleAssignmentDisposable.new()
var on_next = func(value):
var __ = LockGuard.new(parent.lock)
if NO_VALUE not in values:
var res_ = values.duplicate()
res_.push_front(value)
var result = Tuple.new(res_)
observer.on_next(result)
var children_subscription = []
for i in range(children.size()):
var child = children[i]
children_subscription.append(subscribechild.call(i, child))
var disp = parent.subscribe(
on_next, observer.on_error,
observer.on_completed, scheduler
)
parent_subscription.disposable = disp
var ret : Array[SingleAssignmentDisposable] = []
ret.assign(children_subscription.duplicate())
ret.push_front(parent_subscription)
return ret
return CompositeDisposable.new(subscribeall.call(
parent, sources))
return Observable.new(subscribe)