52 lines
1.3 KiB
GDScript
52 lines
1.3 KiB
GDScript
class AverageValue:
|
|
var sum : float
|
|
var count : int
|
|
func _init(sum_, count_):
|
|
self.sum = sum_
|
|
self.count = count_
|
|
|
|
static func average_(
|
|
key_mapper = null
|
|
) -> Callable:
|
|
var average = func(source : Observable) -> Observable:
|
|
# """Partially applied average operator.
|
|
#
|
|
# Computes the average of an observable sequence of values that
|
|
# are in the sequence or obtained by invoking a transform
|
|
# function on each element of the input sequence if present.
|
|
#
|
|
# Examples:
|
|
# >>> var res = average.call(source)
|
|
#
|
|
# Args:
|
|
# source: Source observable to average.
|
|
#
|
|
# Returns:
|
|
# An observable sequence containing a single element with the
|
|
# average of the sequence of values.
|
|
# """
|
|
@warning_ignore("incompatible_ternary")
|
|
var key_mapper_ : Callable = key_mapper if key_mapper != null else func(x): return float(x)
|
|
|
|
var accumulator = func(prev : AverageValue, curr : float) -> AverageValue:
|
|
return AverageValue.new(prev.sum + curr, prev.count + 1)
|
|
|
|
var mapper = func(s : AverageValue) -> float:
|
|
if s.count == 0:
|
|
BadMappingError.new("Input Sequence was empty!").throw()
|
|
return NAN
|
|
|
|
return s.sum / float(s.count)
|
|
|
|
var seed_ = AverageValue.new(0, 0)
|
|
|
|
var ret = source.pipe4(
|
|
GDRx.op.map(key_mapper_),
|
|
GDRx.op.scan(accumulator, seed_),
|
|
GDRx.op.last(),
|
|
GDRx.op.map(mapper)
|
|
)
|
|
return ret
|
|
|
|
return average
|