summaryrefslogtreecommitdiff
path: root/vendor/github.com/samber/lo/math.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/samber/lo/math.go')
-rw-r--r--vendor/github.com/samber/lo/math.go142
1 files changed, 142 insertions, 0 deletions
diff --git a/vendor/github.com/samber/lo/math.go b/vendor/github.com/samber/lo/math.go
new file mode 100644
index 00000000..e3f42892
--- /dev/null
+++ b/vendor/github.com/samber/lo/math.go
@@ -0,0 +1,142 @@
+package lo
+
+import (
+ "github.com/samber/lo/internal/constraints"
+)
+
+// Range creates an array of numbers (positive and/or negative) with given length.
+// Play: https://go.dev/play/p/0r6VimXAi9H
+func Range(elementNum int) []int {
+ length := If(elementNum < 0, -elementNum).Else(elementNum)
+ result := make([]int, length)
+ step := If(elementNum < 0, -1).Else(1)
+ for i, j := 0, 0; i < length; i, j = i+1, j+step {
+ result[i] = j
+ }
+ return result
+}
+
+// RangeFrom creates an array of numbers from start with specified length.
+// Play: https://go.dev/play/p/0r6VimXAi9H
+func RangeFrom[T constraints.Integer | constraints.Float](start T, elementNum int) []T {
+ length := If(elementNum < 0, -elementNum).Else(elementNum)
+ result := make([]T, length)
+ step := If(elementNum < 0, -1).Else(1)
+ for i, j := 0, start; i < length; i, j = i+1, j+T(step) {
+ result[i] = j
+ }
+ return result
+}
+
+// RangeWithSteps creates an array of numbers (positive and/or negative) progressing from start up to, but not including end.
+// step set to zero will return empty array.
+// Play: https://go.dev/play/p/0r6VimXAi9H
+func RangeWithSteps[T constraints.Integer | constraints.Float](start, end, step T) []T {
+ result := []T{}
+ if start == end || step == 0 {
+ return result
+ }
+ if start < end {
+ if step < 0 {
+ return result
+ }
+ for i := start; i < end; i += step {
+ result = append(result, i)
+ }
+ return result
+ }
+ if step > 0 {
+ return result
+ }
+ for i := start; i > end; i += step {
+ result = append(result, i)
+ }
+ return result
+}
+
+// Clamp clamps number within the inclusive lower and upper bounds.
+// Play: https://go.dev/play/p/RU4lJNC2hlI
+func Clamp[T constraints.Ordered](value T, min T, max T) T {
+ if value < min {
+ return min
+ } else if value > max {
+ return max
+ }
+ return value
+}
+
+// Sum sums the values in a collection. If collection is empty 0 is returned.
+// Play: https://go.dev/play/p/upfeJVqs4Bt
+func Sum[T constraints.Float | constraints.Integer | constraints.Complex](collection []T) T {
+ var sum T = 0
+ for i := range collection {
+ sum += collection[i]
+ }
+ return sum
+}
+
+// SumBy summarizes the values in a collection using the given return value from the iteration function. If collection is empty 0 is returned.
+// Play: https://go.dev/play/p/Dz_a_7jN_ca
+func SumBy[T any, R constraints.Float | constraints.Integer | constraints.Complex](collection []T, iteratee func(item T) R) R {
+ var sum R = 0
+ for i := range collection {
+ sum = sum + iteratee(collection[i])
+ }
+ return sum
+}
+
+// Product gets the product of the values in a collection. If collection is empty 0 is returned.
+// Play: https://go.dev/play/p/2_kjM_smtAH
+func Product[T constraints.Float | constraints.Integer | constraints.Complex](collection []T) T {
+ if collection == nil {
+ return 1
+ }
+
+ if len(collection) == 0 {
+ return 1
+ }
+
+ var product T = 1
+ for i := range collection {
+ product *= collection[i]
+ }
+ return product
+}
+
+// ProductBy summarizes the values in a collection using the given return value from the iteration function. If collection is empty 0 is returned.
+// Play: https://go.dev/play/p/wadzrWr9Aer
+func ProductBy[T any, R constraints.Float | constraints.Integer | constraints.Complex](collection []T, iteratee func(item T) R) R {
+ if collection == nil {
+ return 1
+ }
+
+ if len(collection) == 0 {
+ return 1
+ }
+
+ var product R = 1
+ for i := range collection {
+ product = product * iteratee(collection[i])
+ }
+ return product
+}
+
+// Mean calculates the mean of a collection of numbers.
+func Mean[T constraints.Float | constraints.Integer](collection []T) T {
+ var length = T(len(collection))
+ if length == 0 {
+ return 0
+ }
+ var sum = Sum(collection)
+ return sum / length
+}
+
+// MeanBy calculates the mean of a collection of numbers using the given return value from the iteration function.
+func MeanBy[T any, R constraints.Float | constraints.Integer](collection []T, iteratee func(item T) R) R {
+ var length = R(len(collection))
+ if length == 0 {
+ return 0
+ }
+ var sum = SumBy(collection, iteratee)
+ return sum / length
+}