54 lines
1.6 KiB
GDScript
54 lines
1.6 KiB
GDScript
## Constructs an observable sequence that depends on a resource
|
|
## object, whose lifetime is tied to the resulting observable
|
|
## sequence's lifetime.
|
|
## [br]
|
|
## [b]Example:[/b]
|
|
## [codeblock]
|
|
## var res = GDRx.obs.using(func(): return AsyncSubject.new(), func(s): return s)
|
|
## [/codeblock]
|
|
## [br]
|
|
## [b]Args:[/b]
|
|
## [br]
|
|
## [code]resource_factory[/code] Factory function to obtain a resource object.
|
|
## [br]
|
|
## [code]observable_factory[/code] Factory function to obtain an observable
|
|
## sequence that depends on the obtained resource.
|
|
## [br][br]
|
|
##
|
|
## [b]Returns:[/b]
|
|
## [br]
|
|
## An observable sequence whose lifetime controls the lifetime
|
|
## of the dependent resource object.
|
|
static func using_(
|
|
resource_factory : Callable,
|
|
observable_factory : Callable,
|
|
) -> Observable:
|
|
|
|
var subscribe = func(
|
|
observer : ObservableBase,
|
|
scheduler : SchedulerBase = null
|
|
) -> DisposableBase:
|
|
var disp = RefValue.Set(Disposable.new())
|
|
|
|
var d = RefValue.Null()
|
|
var source = RefValue.Null()
|
|
if GDRx.try(func():
|
|
var resource = resource_factory.call()
|
|
if resource is DisposableBase:
|
|
disp.v = resource
|
|
|
|
source.v = observable_factory.call(resource)
|
|
) \
|
|
.catch("Error", func(err):
|
|
d.v = GDRx.obs.throw(err).subscribe(observer, GDRx.basic.noop, GDRx.basic.noop, scheduler)
|
|
) \
|
|
.end_try_catch():
|
|
return CompositeDisposable.new([d.v, disp.v])
|
|
|
|
return CompositeDisposable.new([
|
|
source.v.subscribe(observer, GDRx.basic.noop, GDRx.basic.noop, scheduler),
|
|
disp.v
|
|
])
|
|
|
|
return Observable.new(subscribe)
|