ev/pkg/math/math.go

68 lines
1.1 KiB
Go
Raw Permalink Normal View History

2022-08-04 14:37:51 -06:00
package math
type signed interface {
~int | ~int8 | ~int16 | ~int32 | ~int64
}
type unsigned interface {
~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr
}
type integer interface {
signed | unsigned
}
type float interface {
~float32 | ~float64
}
type ordered interface {
integer | float | ~string
}
func Abs[T signed](i T) T {
if i > 0 {
return i
}
return -i
}
2022-08-06 09:52:36 -06:00
func Max[T ordered](i T, candidates ...T) T {
for _, j := range candidates {
if i < j {
i = j
}
2022-08-04 14:37:51 -06:00
}
2022-08-06 09:52:36 -06:00
return i
2022-08-04 14:37:51 -06:00
}
2022-08-06 09:52:36 -06:00
func Min[T ordered](i T, candidates ...T) T {
for _, j := range candidates {
if i > j {
i = j
}
2022-08-04 14:37:51 -06:00
}
2022-08-06 09:52:36 -06:00
return i
2022-08-04 14:37:51 -06:00
}
2022-08-10 10:09:58 -06:00
func PagerBox(first, last uint64, pos, count int64) (uint64, int64) {
var start uint64
if pos >= 0 {
start = first + uint64(pos)
} else {
start = uint64(int64(last) + pos + 1)
}
switch {
case count > 0:
count = Min(count, int64(last-start)+1)
case pos >= 0 && count < 0:
count = Max(count, int64(first-start))
case pos < 0 && count < 0:
count = Max(count, int64(first-start)-1)
}
if count == 0 || (start < first && count <= 0) || (start > last && count >= 0) {
return 0, 0
}
return start, count
}