diff --git a/pkg/fixedpoint/reduce.go b/pkg/fixedpoint/reduce.go index fc8db575c..0b8edbf7f 100644 --- a/pkg/fixedpoint/reduce.go +++ b/pkg/fixedpoint/reduce.go @@ -2,7 +2,16 @@ package fixedpoint type Reducer func(prev, curr Value) Value -func Reduce(values []Value, init Value, reducer Reducer) Value { +func SumReducer(prev, curr Value) Value { + return prev.Add(curr) +} + +func Reduce(values []Value, reducer Reducer, a ...Value) Value { + init := Zero + if len(a) > 0 { + init = a[0] + } + if len(values) == 0 { return init } diff --git a/pkg/fixedpoint/reduce_test.go b/pkg/fixedpoint/reduce_test.go index 704e1d590..58000623b 100644 --- a/pkg/fixedpoint/reduce_test.go +++ b/pkg/fixedpoint/reduce_test.go @@ -31,7 +31,7 @@ func TestReduce(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - assert.Equalf(t, tt.want, Reduce(tt.args.values, tt.args.init, tt.args.reducer), "Reduce(%v, %v, %v)", tt.args.values, tt.args.init, tt.args.reducer) + assert.Equalf(t, tt.want, Reduce(tt.args.values, tt.args.reducer, tt.args.init), "Reduce(%v, %v, %v)", tt.args.values, tt.args.init, tt.args.reducer) }) } } diff --git a/pkg/fixedpoint/slice.go b/pkg/fixedpoint/slice.go index a59542787..c5a7db173 100644 --- a/pkg/fixedpoint/slice.go +++ b/pkg/fixedpoint/slice.go @@ -2,8 +2,8 @@ package fixedpoint type Slice []Value -func (s Slice) Reduce(init Value, reducer Reducer) Value { - return Reduce(s, init, reducer) +func (s Slice) Reduce(reducer Reducer, a ...Value) Value { + return Reduce(s, reducer, a...) } // Defaults to ascending sort