1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package list
16
17 import (
18 "fmt"
19
20 "github.com/cockroachdb/apd/v3"
21
22 "cuelang.org/go/internal"
23 )
24
25
26 func Avg(xs []*internal.Decimal) (*internal.Decimal, error) {
27 if 0 == len(xs) {
28 return nil, fmt.Errorf("empty list")
29 }
30
31 s := apd.New(0, 0)
32 for _, x := range xs {
33 _, err := internal.BaseContext.Add(s, x, s)
34 if err != nil {
35 return nil, err
36 }
37 }
38
39 var d apd.Decimal
40 l := apd.New(int64(len(xs)), 0)
41 _, err := internal.BaseContext.Quo(&d, s, l)
42 if err != nil {
43 return nil, err
44 }
45 return &d, nil
46 }
47
48
49 func Max(xs []*internal.Decimal) (*internal.Decimal, error) {
50 if 0 == len(xs) {
51 return nil, fmt.Errorf("empty list")
52 }
53
54 max := xs[0]
55 for _, x := range xs[1:] {
56 if -1 == max.Cmp(x) {
57 max = x
58 }
59 }
60 return max, nil
61 }
62
63
64 func Min(xs []*internal.Decimal) (*internal.Decimal, error) {
65 if 0 == len(xs) {
66 return nil, fmt.Errorf("empty list")
67 }
68
69 min := xs[0]
70 for _, x := range xs[1:] {
71 if +1 == min.Cmp(x) {
72 min = x
73 }
74 }
75 return min, nil
76 }
77
78
79 func Product(xs []*internal.Decimal) (*internal.Decimal, error) {
80 d := apd.New(1, 0)
81 for _, x := range xs {
82 _, err := internal.BaseContext.Mul(d, x, d)
83 if err != nil {
84 return nil, err
85 }
86 }
87 return d, nil
88 }
89
90
91
92
93
94
95
96
97
98
99
100 func Range(start, limit, step *internal.Decimal) ([]*internal.Decimal, error) {
101 if step.IsZero() {
102 return nil, fmt.Errorf("step must be non zero")
103 }
104
105 if !step.Negative && +1 == start.Cmp(limit) {
106 return nil, fmt.Errorf("end must be greater than start when step is positive")
107 }
108
109 if step.Negative && -1 == start.Cmp(limit) {
110 return nil, fmt.Errorf("end must be less than start when step is negative")
111 }
112
113 var vals []*internal.Decimal
114 num := start
115 for {
116 if !step.Negative && -1 != num.Cmp(limit) {
117 break
118 }
119
120 if step.Negative && +1 != num.Cmp(limit) {
121 break
122 }
123
124 vals = append(vals, num)
125 d := apd.New(0, 0)
126 _, err := internal.BaseContext.Add(d, step, num)
127 if err != nil {
128 return nil, err
129 }
130 num = d
131 }
132 return vals, nil
133 }
134
135
136 func Sum(xs []*internal.Decimal) (*internal.Decimal, error) {
137 d := apd.New(0, 0)
138 for _, x := range xs {
139 _, err := internal.BaseContext.Add(d, x, d)
140 if err != nil {
141 return nil, err
142 }
143 }
144 return d, nil
145 }
146
View as plain text