podman
186 строк · 3.3 Кб
1package sprig
2
3import (
4"fmt"
5"math"
6"strconv"
7"strings"
8
9"github.com/spf13/cast"
10"github.com/shopspring/decimal"
11)
12
13// toFloat64 converts 64-bit floats
14func toFloat64(v interface{}) float64 {
15return cast.ToFloat64(v)
16}
17
18func toInt(v interface{}) int {
19return cast.ToInt(v)
20}
21
22// toInt64 converts integer types to 64-bit integers
23func toInt64(v interface{}) int64 {
24return cast.ToInt64(v)
25}
26
27func max(a interface{}, i ...interface{}) int64 {
28aa := toInt64(a)
29for _, b := range i {
30bb := toInt64(b)
31if bb > aa {
32aa = bb
33}
34}
35return aa
36}
37
38func maxf(a interface{}, i ...interface{}) float64 {
39aa := toFloat64(a)
40for _, b := range i {
41bb := toFloat64(b)
42aa = math.Max(aa, bb)
43}
44return aa
45}
46
47func min(a interface{}, i ...interface{}) int64 {
48aa := toInt64(a)
49for _, b := range i {
50bb := toInt64(b)
51if bb < aa {
52aa = bb
53}
54}
55return aa
56}
57
58func minf(a interface{}, i ...interface{}) float64 {
59aa := toFloat64(a)
60for _, b := range i {
61bb := toFloat64(b)
62aa = math.Min(aa, bb)
63}
64return aa
65}
66
67func until(count int) []int {
68step := 1
69if count < 0 {
70step = -1
71}
72return untilStep(0, count, step)
73}
74
75func untilStep(start, stop, step int) []int {
76v := []int{}
77
78if stop < start {
79if step >= 0 {
80return v
81}
82for i := start; i > stop; i += step {
83v = append(v, i)
84}
85return v
86}
87
88if step <= 0 {
89return v
90}
91for i := start; i < stop; i += step {
92v = append(v, i)
93}
94return v
95}
96
97func floor(a interface{}) float64 {
98aa := toFloat64(a)
99return math.Floor(aa)
100}
101
102func ceil(a interface{}) float64 {
103aa := toFloat64(a)
104return math.Ceil(aa)
105}
106
107func round(a interface{}, p int, rOpt ...float64) float64 {
108roundOn := .5
109if len(rOpt) > 0 {
110roundOn = rOpt[0]
111}
112val := toFloat64(a)
113places := toFloat64(p)
114
115var round float64
116pow := math.Pow(10, places)
117digit := pow * val
118_, div := math.Modf(digit)
119if div >= roundOn {
120round = math.Ceil(digit)
121} else {
122round = math.Floor(digit)
123}
124return round / pow
125}
126
127// converts unix octal to decimal
128func toDecimal(v interface{}) int64 {
129result, err := strconv.ParseInt(fmt.Sprint(v), 8, 64)
130if err != nil {
131return 0
132}
133return result
134}
135
136func seq(params ...int) string {
137increment := 1
138switch len(params) {
139case 0:
140return ""
141case 1:
142start := 1
143end := params[0]
144if end < start {
145increment = -1
146}
147return intArrayToString(untilStep(start, end+increment, increment), " ")
148case 3:
149start := params[0]
150end := params[2]
151step := params[1]
152if end < start {
153increment = -1
154if step > 0 {
155return ""
156}
157}
158return intArrayToString(untilStep(start, end+increment, step), " ")
159case 2:
160start := params[0]
161end := params[1]
162step := 1
163if end < start {
164step = -1
165}
166return intArrayToString(untilStep(start, end+step, step), " ")
167default:
168return ""
169}
170}
171
172func intArrayToString(slice []int, delimeter string) string {
173return strings.Trim(strings.Join(strings.Fields(fmt.Sprint(slice)), delimeter), "[]")
174}
175
176// performs a float and subsequent decimal.Decimal conversion on inputs,
177// and iterates through a and b executing the mathmetical operation f
178func execDecimalOp(a interface{}, b []interface{}, f func(d1, d2 decimal.Decimal) decimal.Decimal) float64 {
179prt := decimal.NewFromFloat(toFloat64(a))
180for _, x := range b {
181dx := decimal.NewFromFloat(toFloat64(x))
182prt = f(prt, dx)
183}
184rslt, _ := prt.Float64()
185return rslt
186}
187