41 lines
988 B
GDScript3
Raw Permalink Normal View History

2024-12-27 21:00:07 +01:00
static func find_value_(
predicate : Callable, yield_index : bool
) -> Callable:
var find_value = func(source : Observable) -> Observable:
var subscribe = func(
observer : ObserverBase,
scheduler : SchedulerBase = null
) -> DisposableBase:
var index = RefValue.Set(0)
var on_next = func(x):
var should_run = RefValue.Set(false)
if GDRx.try(func():
should_run.v = predicate.call(x, index.v, source)
) \
.catch("Error", func(err):
observer.on_error(err)
) \
.end_try_catch(): return
if should_run.v:
observer.on_next(index.v if yield_index else x)
observer.on_completed()
else:
index.v += 1
var on_completed = func():
@warning_ignore("incompatible_ternary")
observer.on_next(-1 if yield_index else null)
observer.on_completed()
return source.subscribe(
on_next, observer.on_error, on_completed,
scheduler
)
return Observable.new(subscribe)
return find_value