feat(utils): add pkg utils
This commit is contained in:
parent
456b6e457c
commit
13df4ae706
37
pkg/formatters/duration.go
Normal file
37
pkg/formatters/duration.go
Normal file
@ -0,0 +1,37 @@
|
||||
package formatters
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
// FormatDuration takes a duration and returns a human-readable duration string.
|
||||
// For example: 1928371 seconds -> "22d 7h 39m 31s"
|
||||
func FormatDuration(d time.Duration) string {
|
||||
if d == 0 {
|
||||
return "N/A"
|
||||
}
|
||||
|
||||
var parts []string
|
||||
|
||||
days := int(d.Hours()) / 24
|
||||
hours := int(d.Hours()) % 24
|
||||
minutes := int(d.Minutes()) % 60
|
||||
seconds := int(d.Seconds()) % 60
|
||||
|
||||
if days > 0 {
|
||||
parts = append(parts, fmt.Sprintf("%dd", days))
|
||||
}
|
||||
if hours > 0 {
|
||||
parts = append(parts, fmt.Sprintf("%dh", hours))
|
||||
}
|
||||
if minutes > 0 {
|
||||
parts = append(parts, fmt.Sprintf("%dm", minutes))
|
||||
}
|
||||
if seconds > 0 {
|
||||
parts = append(parts, fmt.Sprintf("%ds", seconds))
|
||||
}
|
||||
|
||||
return strings.Join(parts, " ")
|
||||
}
|
45
pkg/formatters/numbers.go
Normal file
45
pkg/formatters/numbers.go
Normal file
@ -0,0 +1,45 @@
|
||||
package formatters
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
)
|
||||
|
||||
// FormatNumber takes an int64 and returns a human-readable string.
|
||||
// For example: 19823 -> "19.8k", 1500000 -> "1.5M"
|
||||
func FormatNumber(input int64) string {
|
||||
if input == 0 {
|
||||
return "0"
|
||||
}
|
||||
|
||||
// Handle Negative
|
||||
negative := input < 0
|
||||
if negative {
|
||||
input = -input
|
||||
}
|
||||
|
||||
abbreviations := []string{"", "k", "M", "B", "T"}
|
||||
abbrevIndex := int(math.Log10(float64(input)) / 3)
|
||||
|
||||
// Bounds Check
|
||||
if abbrevIndex >= len(abbreviations) {
|
||||
abbrevIndex = len(abbreviations) - 1
|
||||
}
|
||||
|
||||
scaledNumber := float64(input) / math.Pow(10, float64(abbrevIndex*3))
|
||||
|
||||
var result string
|
||||
if scaledNumber >= 100 {
|
||||
result = fmt.Sprintf("%.0f%s", scaledNumber, abbreviations[abbrevIndex])
|
||||
} else if scaledNumber >= 10 {
|
||||
result = fmt.Sprintf("%.1f%s", scaledNumber, abbreviations[abbrevIndex])
|
||||
} else {
|
||||
result = fmt.Sprintf("%.2f%s", scaledNumber, abbreviations[abbrevIndex])
|
||||
}
|
||||
|
||||
if negative {
|
||||
result = "-" + result
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
13
pkg/ptr/ptr.go
Normal file
13
pkg/ptr/ptr.go
Normal file
@ -0,0 +1,13 @@
|
||||
package ptr
|
||||
|
||||
func Of[T any](v T) *T {
|
||||
return &v
|
||||
}
|
||||
|
||||
func Deref[T any](v *T) T {
|
||||
var zeroT T
|
||||
if v == nil {
|
||||
return zeroT
|
||||
}
|
||||
return *v
|
||||
}
|
17
pkg/sliceutils/sliceutils.go
Normal file
17
pkg/sliceutils/sliceutils.go
Normal file
@ -0,0 +1,17 @@
|
||||
package sliceutils
|
||||
|
||||
func First[T any](s []T) (T, bool) {
|
||||
if len(s) == 0 {
|
||||
var zeroT T
|
||||
return zeroT, false
|
||||
}
|
||||
return s[0], true
|
||||
}
|
||||
|
||||
func Map[R, I any](s []I, f func(I) R) []R {
|
||||
r := make([]R, 0, len(s))
|
||||
for _, v := range s {
|
||||
r = append(r, f(v))
|
||||
}
|
||||
return r
|
||||
}
|
18
pkg/utils/utils.go
Normal file
18
pkg/utils/utils.go
Normal file
@ -0,0 +1,18 @@
|
||||
package utils
|
||||
|
||||
func Ternary[T any](cond bool, tVal, fVal T) T {
|
||||
if cond {
|
||||
return tVal
|
||||
}
|
||||
return fVal
|
||||
}
|
||||
|
||||
func FirstNonZero[T comparable](v ...T) T {
|
||||
var zero T
|
||||
for _, val := range v {
|
||||
if val != zero {
|
||||
return val
|
||||
}
|
||||
}
|
||||
return zero
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user