diff options
| author | Xe Iaso <me@xeiaso.net> | 2024-04-15 21:11:52 -0400 |
|---|---|---|
| committer | Xe Iaso <me@xeiaso.net> | 2024-04-15 21:11:52 -0400 |
| commit | 5a2c263a074daa0755a519ff93d2eb5bf4f9bee6 (patch) | |
| tree | 62091e92d792fcfd711ced58d83d136e2f2991fa | |
| parent | 91b2cdc4f2747f730a493b23f2362701eaefa066 (diff) | |
| download | x-5a2c263a074daa0755a519ff93d2eb5bf4f9bee6.tar.xz x-5a2c263a074daa0755a519ff93d2eb5bf4f9bee6.zip | |
cursed: add reduce
Signed-off-by: Xe Iaso <me@xeiaso.net>
| -rw-r--r-- | cursed/reduce.go | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/cursed/reduce.go b/cursed/reduce.go new file mode 100644 index 0000000..bd9f865 --- /dev/null +++ b/cursed/reduce.go @@ -0,0 +1,53 @@ +package cursed + +import "golang.org/x/exp/constraints" + +func Reduce[D any](data []D, doer func(D, D) D) D { + var initial D + + return Fold[D, D](initial, data, doer) +} + +func Fold[T any, U any](initial U, data []T, doer func(T, U) U) U { + acc := initial + for _, d := range data { + temp := doer(d, acc) + acc = temp + } + + return acc +} + +type Number interface { + constraints.Float | constraints.Integer +} + +func Sum[T Number](data []T) T { + return Reduce[T](data, func(x, y T) T { + return x + y + }) +} + +func Max[T Number](data []T) T { + return Reduce[T](data, func(x, y T) T { + if x > y { + return x + } else if y < x { + return y + } else { + return x // x == y + } + }) +} + +func Min[T Number](data []T) T { + return Reduce[T](data, func(x, y T) T { + if x > y { + return y + } else if y < x { + return x + } else { + return x // x == y + } + }) +} |
