forked from Rhymond/go-money
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutils.go
94 lines (87 loc) · 1.62 KB
/
utils.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package money
import "github.com/shopspring/decimal"
func Sum(moneys ...*Money) (sum *Money, err error) {
for _, money := range moneys {
if sum == nil {
sum = money
continue
}
sum, err = sum.Add(money)
if err != nil {
return
}
}
return
}
func Average(moneys ...*Money) (average *Money, err error) {
sum, err := Sum(moneys...)
if err != nil {
return
}
average = sum.Divide(decimal.NewFromInt(int64(len(moneys))))
return
}
func Min(moneys ...*Money) (min *Money, err error) {
for _, money := range moneys {
if min == nil {
min = money
continue
}
lt, err := money.LessThan(min)
if err != nil {
return nil, err
}
if lt {
min = money
}
}
return
}
func Max(moneys ...*Money) (max *Money, err error) {
for _, money := range moneys {
if max == nil {
max = money
continue
}
gt, err := money.GreaterThan(max)
if err != nil {
return nil, err
}
if gt {
max = money
}
}
return
}
func Sort(moneys []*Money) (sorted []*Money, err error) {
sorted = make([]*Money, len(moneys))
copy(sorted, moneys)
for i := 0; i < len(sorted); i++ {
for j := i + 1; j < len(sorted); j++ {
lt, err := sorted[j].LessThan(sorted[i])
if err != nil {
return nil, err
}
if lt {
sorted[i], sorted[j] = sorted[j], sorted[i]
}
}
}
return
}
func Median(moneys ...*Money) (mean *Money, err error) {
sorted, err := Sort(moneys)
if err != nil {
return
}
if len(sorted)%2 == 0 {
mean, err = Sum(sorted[len(sorted)/2-1], sorted[len(sorted)/2])
if err != nil {
return
}
mean = mean.Divide(decimal.NewFromInt(2))
} else {
mean = sorted[len(sorted)/2]
}
return
}