aboutsummaryrefslogtreecommitdiff
path: root/math
diff options
context:
space:
mode:
authorAlexander Kiryukhin <a.kiryukhin@mail.ru>2022-05-01 21:50:12 +0300
committerAlexander Kiryukhin <a.kiryukhin@mail.ru>2022-05-01 21:50:12 +0300
commit9fcf8e29214210612d545bed50d7f889800ac639 (patch)
tree3a99d2cd37fb8158d49abc1de6298758d205c9dd /math
Initial
Diffstat (limited to 'math')
-rw-r--r--math/doc.go2
-rw-r--r--math/mimax.go63
-rw-r--r--math/minmax_test.go58
3 files changed, 123 insertions, 0 deletions
diff --git a/math/doc.go b/math/doc.go
new file mode 100644
index 0000000..1d3cbf5
--- /dev/null
+++ b/math/doc.go
@@ -0,0 +1,2 @@
+// Пакет с математическими функциями над обобщенными типами
+package math
diff --git a/math/mimax.go b/math/mimax.go
new file mode 100644
index 0000000..546afba
--- /dev/null
+++ b/math/mimax.go
@@ -0,0 +1,63 @@
+package math
+
+import "go.neonxp.dev/extra/utils"
+
+// MinScalar возвращает минимальное из переданных скалярных значений
+func MinScalar[T utils.Scalar](a ...T) T {
+ i := -1
+ for j, v := range a {
+ if i == -1 {
+ i = j
+ continue
+ }
+ if v < a[i] {
+ i = j
+ }
+ }
+ return a[i]
+}
+
+// MaxScalar возвращает максимальное из переданных скалярных значений
+func MaxScalar[T utils.Scalar](a ...T) T {
+ i := -1
+ for j, v := range a {
+ if i == -1 {
+ i = j
+ continue
+ }
+ if v > a[i] {
+ i = j
+ }
+ }
+ return a[i]
+}
+
+// Min возвращает минимальное из переданных Sortable значений
+func Min[T utils.Sortable[T]](a ...T) T {
+ i := -1
+ for j, v := range a {
+ if i == -1 {
+ i = j
+ continue
+ }
+ if v.Less(a[i]) {
+ i = j
+ }
+ }
+ return a[i]
+}
+
+// Max возвращает максимальное из переданных Sortable значений
+func Max[T utils.Sortable[T]](a ...T) T {
+ i := -1
+ for j, v := range a {
+ if i == -1 {
+ i = j
+ continue
+ }
+ if a[i].Less(v) {
+ i = j
+ }
+ }
+ return a[i]
+}
diff --git a/math/minmax_test.go b/math/minmax_test.go
new file mode 100644
index 0000000..00211e2
--- /dev/null
+++ b/math/minmax_test.go
@@ -0,0 +1,58 @@
+package math
+
+import (
+ "reflect"
+ "testing"
+)
+
+func TestMin(t *testing.T) {
+ type args struct {
+ a []int
+ }
+ tests := []struct {
+ name string
+ args args
+ want int
+ }{
+ {
+ name: "test1",
+ args: args{
+ a: []int{8, 3, 6},
+ },
+ want: 3,
+ },
+ }
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ if got := MinScalar(tt.args.a...); !reflect.DeepEqual(got, tt.want) {
+ t.Errorf("Min() = %v, want %v", got, tt.want)
+ }
+ })
+ }
+}
+
+func TestMax(t *testing.T) {
+ type args struct {
+ a []int
+ }
+ tests := []struct {
+ name string
+ args args
+ want int
+ }{
+ {
+ name: "test1",
+ args: args{
+ a: []int{8, 13, 6},
+ },
+ want: 13,
+ },
+ }
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ if got := MaxScalar(tt.args.a...); !reflect.DeepEqual(got, tt.want) {
+ t.Errorf("Max() = %v, want %v", got, tt.want)
+ }
+ })
+ }
+}