aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXe Iaso <me@xeiaso.net>2024-04-15 21:11:52 -0400
committerXe Iaso <me@xeiaso.net>2024-04-15 21:11:52 -0400
commit5a2c263a074daa0755a519ff93d2eb5bf4f9bee6 (patch)
tree62091e92d792fcfd711ced58d83d136e2f2991fa
parent91b2cdc4f2747f730a493b23f2362701eaefa066 (diff)
downloadx-5a2c263a074daa0755a519ff93d2eb5bf4f9bee6.tar.xz
x-5a2c263a074daa0755a519ff93d2eb5bf4f9bee6.zip
cursed: add reduce
Signed-off-by: Xe Iaso <me@xeiaso.net>
-rw-r--r--cursed/reduce.go53
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
+ }
+ })
+}