32 lines
826 B
GDScript3
32 lines
826 B
GDScript3
|
|
static func ref_count_() -> Callable:
|
||
|
|
|
||
|
|
var connectable_subscription = RefValue.Null()
|
||
|
|
var count = RefValue.Set(0)
|
||
|
|
|
||
|
|
var ref_count = func(source : ConnectableObservable) -> Observable:
|
||
|
|
var subscribe = func(
|
||
|
|
observer : ObserverBase,
|
||
|
|
scheduler : SchedulerBase = null
|
||
|
|
) -> DisposableBase:
|
||
|
|
|
||
|
|
count.v += 1
|
||
|
|
var should_connect = count.v == 1
|
||
|
|
var subscription = source.subscribe(
|
||
|
|
observer, GDRx.basic.noop, GDRx.basic.noop,
|
||
|
|
scheduler
|
||
|
|
)
|
||
|
|
if should_connect:
|
||
|
|
connectable_subscription.v = source.connect_observable(scheduler)
|
||
|
|
|
||
|
|
var dispose = func():
|
||
|
|
subscription.dispose()
|
||
|
|
count.v -= 1
|
||
|
|
if count.v <= 0 and connectable_subscription.v != null:
|
||
|
|
connectable_subscription.v.dispose()
|
||
|
|
|
||
|
|
return Disposable.new(dispose)
|
||
|
|
|
||
|
|
return Observable.new(subscribe)
|
||
|
|
|
||
|
|
return ref_count
|