TestGame/addons/reactivex/operators/_sequenceequal.gd
2024-12-27 21:00:07 +01:00

122 lines
3.1 KiB
GDScript

static func sequence_equal_(
second, # Array or Observable
comparer = null,
second_it : IterableBase = null
) -> Callable:
var comparer_ = comparer if comparer != null else GDRx.basic.default_comparer
var second_ : Observable
if second is Array:
second_ = GDRx.obs.from_iterable(GDRx.util.Iter(second))
else:
second_ = second if second_it == null else GDRx.obs.from_iterable(second_it)
var sequence_equal = func(source : Observable) -> Observable:
# """Determines whether two sequences are equal by comparing the
# elements pairwise using a specified equality comparer.
#
# Examples:
# >>> var res = sequence_equal([1,2,3])
# >>> var res = sequence_equal([{ "value": 42 }], func(x, y): return x.value == y.value)
# >>> var res = sequence_equal(GDRx.obs.return_value(42))
# >>> var res = sequence_equal(
# GDRx.obs.return_value({ "value": 42 }),
# func(x, y): return x.value == y.value
# )
#
# Args:
# source: Source obserable to compare.
#
# Returns:
# An observable sequence that contains a single element which
# indicates whether both sequences are of equal length and their
# corresponding elements are equal according to the specified
# equality comparer.
# """
var first = source
var subscribe = func(
observer : ObserverBase,
scheduler : SchedulerBase = null
) -> DisposableBase:
var donel = [false]
var doner = [false]
var ql = []
var qr = []
var on_next1 = func(x):
if qr.size() > 0:
var v = qr.pop_front()
var equal = RefValue.Set(true)
if GDRx.try(func():
equal.v = comparer_.call(v, x)
) \
.catch("Error", func(e):
observer.on_error(e)
) \
.end_try_catch(): return
if not equal.v:
observer.on_next(false)
observer.on_completed()
elif doner[0]:
observer.on_next(false)
observer.on_completed()
else:
ql.append(x)
var on_completed1 = func():
donel[0] = true
if ql.is_empty():
if not qr.is_empty():
observer.on_next(false)
observer.on_completed()
elif doner[0]:
observer.on_next(true)
observer.on_completed()
var on_next2 = func(x):
if ql.size() > 0:
var v = ql.pop_front()
var equal = RefValue.Set(true)
if GDRx.try(func():
equal.v = comparer_.call(v, x)
) \
.catch("Error", func(e):
observer.on_error(e)
) \
.end_try_catch(): return
if not equal.v:
observer.on_next(false)
observer.on_completed()
elif donel[0]:
observer.on_next(false)
observer.on_completed()
else:
qr.append(x)
var on_completed2 = func():
doner[0] = true
if qr.is_empty():
if not ql.is_empty():
observer.on_next(false)
observer.on_completed()
elif donel[0]:
observer.on_next(true)
observer.on_completed()
var subscription1 = first.subscribe(
on_next1, observer.on_error, on_completed1, scheduler
)
var subscription2 = second_.subscribe(
on_next2, observer.on_error, on_completed2, scheduler
)
return CompositeDisposable.new([subscription1, subscription2])
return Observable.new(subscribe)
return sequence_equal