123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- package help
- // Aggregate applies an accumulator function over a sequence.
- //
- // Aggregate method makes it simple to perform a calculation over a sequence of
- // values. This method works by calling f() one time for each element in source
- // except the first one. Each time f() is called, Aggregate passes both the
- // element from the sequence and an aggregated value (as the first argument to
- // f()). The first element of source is used as the initial aggregate value. The
- // result of f() replaces the previous aggregated value.
- //
- // Aggregate returns the final result of f().
- func (q Query) Aggregate(f func(interface{}, interface{}) interface{}) interface{} {
- next := q.Iterate()
- result, any := next()
- if !any {
- return nil
- }
- for current, ok := next(); ok; current, ok = next() {
- result = f(result, current)
- }
- return result
- }
- // AggregateT is the typed version of Aggregate.
- //
- // - f is of type: func(TSource, TSource) TSource
- //
- // NOTE: Aggregate has better performance than AggregateT.
- func (q Query) AggregateT(f interface{}) interface{} {
- fGenericFunc, err := newGenericFunc(
- "AggregateT", "f", f,
- simpleParamValidator(newElemTypeSlice(new(genericType), new(genericType)), newElemTypeSlice(new(genericType))),
- )
- if err != nil {
- panic(err)
- }
- fFunc := func(result interface{}, current interface{}) interface{} {
- return fGenericFunc.Call(result, current)
- }
- return q.Aggregate(fFunc)
- }
- // AggregateWithSeed applies an accumulator function over a sequence. The
- // specified seed value is used as the initial accumulator value.
- //
- // Aggregate method makes it simple to perform a calculation over a sequence of
- // values. This method works by calling f() one time for each element in source
- // except the first one. Each time f() is called, Aggregate passes both the
- // element from the sequence and an aggregated value (as the first argument to
- // f()). The value of the seed parameter is used as the initial aggregate value.
- // The result of f() replaces the previous aggregated value.
- //
- // Aggregate returns the final result of f().
- func (q Query) AggregateWithSeed(seed interface{},
- f func(interface{}, interface{}) interface{}) interface{} {
- next := q.Iterate()
- result := seed
- for current, ok := next(); ok; current, ok = next() {
- result = f(result, current)
- }
- return result
- }
- // AggregateWithSeedT is the typed version of AggregateWithSeed.
- //
- // - f is of type "func(TAccumulate, TSource) TAccumulate"
- //
- // NOTE: AggregateWithSeed has better performance than
- // AggregateWithSeedT.
- func (q Query) AggregateWithSeedT(seed interface{},
- f interface{}) interface{} {
- fGenericFunc, err := newGenericFunc(
- "AggregateWithSeed", "f", f,
- simpleParamValidator(newElemTypeSlice(new(genericType), new(genericType)), newElemTypeSlice(new(genericType))),
- )
- if err != nil {
- panic(err)
- }
- fFunc := func(result interface{}, current interface{}) interface{} {
- return fGenericFunc.Call(result, current)
- }
- return q.AggregateWithSeed(seed, fFunc)
- }
- // AggregateWithSeedBy applies an accumulator function over a sequence. The
- // specified seed value is used as the initial accumulator value, and the
- // specified function is used to select the result value.
- //
- // Aggregate method makes it simple to perform a calculation over a sequence of
- // values. This method works by calling f() one time for each element in source.
- // Each time func is called, Aggregate passes both the element from the sequence
- // and an aggregated value (as the first argument to func). The value of the
- // seed parameter is used as the initial aggregate value. The result of func
- // replaces the previous aggregated value.
- //
- // The final result of func is passed to resultSelector to obtain the final
- // result of Aggregate.
- func (q Query) AggregateWithSeedBy(seed interface{},
- f func(interface{}, interface{}) interface{},
- resultSelector func(interface{}) interface{}) interface{} {
- next := q.Iterate()
- result := seed
- for current, ok := next(); ok; current, ok = next() {
- result = f(result, current)
- }
- return resultSelector(result)
- }
- // AggregateWithSeedByT is the typed version of AggregateWithSeedBy.
- //
- // - f is of type "func(TAccumulate, TSource) TAccumulate"
- // - resultSelectorFn is of type "func(TAccumulate) TResult"
- //
- // NOTE: AggregateWithSeedBy has better performance than
- // AggregateWithSeedByT.
- func (q Query) AggregateWithSeedByT(seed interface{},
- f interface{},
- resultSelectorFn interface{}) interface{} {
- fGenericFunc, err := newGenericFunc(
- "AggregateWithSeedByT", "f", f,
- simpleParamValidator(newElemTypeSlice(new(genericType), new(genericType)), newElemTypeSlice(new(genericType))),
- )
- if err != nil {
- panic(err)
- }
- fFunc := func(result interface{}, current interface{}) interface{} {
- return fGenericFunc.Call(result, current)
- }
- resultSelectorGenericFunc, err := newGenericFunc(
- "AggregateWithSeedByT", "resultSelectorFn", resultSelectorFn,
- simpleParamValidator(newElemTypeSlice(new(genericType)), newElemTypeSlice(new(genericType))),
- )
- if err != nil {
- panic(err)
- }
- resultSelectorFunc := func(result interface{}) interface{} {
- return resultSelectorGenericFunc.Call(result)
- }
- return q.AggregateWithSeedBy(seed, fFunc, resultSelectorFunc)
- }
|