Source file
src/tawesoft.co.uk/go/operator/int.go
Documentation:
src/tawesoft.co.uk/go/operator/int.go
1 package operator
2
3
4
5
6
7
8 type intUnary struct {
9 Identity func(int) int
10 Abs func(int) int
11 Negation func(int) int
12 Zero func(int) bool
13 NonZero func(int) bool
14 Positive func(int) bool
15 Negative func(int) bool
16 }
17
18 type intUnaryChecked struct {
19 Abs func(int) (int, error)
20 Negation func(int) (int, error)
21 }
22
23 type intBinary struct {
24 Add func(int, int) int
25 Sub func(int, int) int
26 Mul func(int, int) int
27 Div func(int, int) int
28 Mod func(int, int) int
29
30 Eq func(int, int) bool
31 Neq func(int, int) bool
32 Lt func(int, int) bool
33 Lte func(int, int) bool
34 Gt func(int, int) bool
35 Gte func(int, int) bool
36
37 And func(int, int) int
38 Or func(int, int) int
39 Xor func(int, int) int
40 AndNot func(int, int) int
41
42 Shl func(int, uint) int
43 Shr func(int, uint) int
44 }
45
46 type intBinaryChecked struct {
47 Add func(int, int) (int, error)
48 Sub func(int, int) (int, error)
49 Mul func(int, int) (int, error)
50 Div func(int, int) (int, error)
51
52 Shl func(int, uint) (int, error)
53 Shr func(int, uint) (int, error)
54 }
55
56 type intNary struct {
57 Add func(... int) int
58 Sub func(... int) int
59 Mul func(... int) int
60 }
61
62 type intNaryChecked struct {
63 Add func(... int) (int, error)
64 Sub func(... int) (int, error)
65 Mul func(... int) (int, error)
66 }
67
68
69 var Int = struct {
70 Unary intUnary
71 Binary intBinary
72 Nary intNary
73 Reduce func(operatorIdentity int, operator func(int, int) int, elements ... int) int
74 }{
75 Unary: intUnary{
76 Identity: func(a int) int { return a },
77 Abs: intUnaryAbs,
78 Negation: func(a int) int { return -a },
79 Zero: func(a int) bool { return a == 0 },
80 NonZero: func(a int) bool { return a != 0 },
81 Positive: intUnaryPositive,
82 Negative: intUnaryNegative,
83 },
84
85 Binary: intBinary{
86 Add: func(a int, b int) int { return a + b },
87 Sub: func(a int, b int) int { return a - b },
88 Mul: func(a int, b int) int { return a * b },
89 Div: func(a int, b int) int { return a / b },
90
91 Eq: func(a int, b int) bool { return a == b },
92 Neq: func(a int, b int) bool { return a != b },
93 Lt: func(a int, b int) bool { return a < b },
94 Lte: func(a int, b int) bool { return a <= b },
95 Gt: func(a int, b int) bool { return a > b },
96 Gte: func(a int, b int) bool { return a >= b },
97
98 And: func(a int, b int) int { return a & b },
99 Or: func(a int, b int) int { return a | b },
100 Xor: func(a int, b int) int { return a ^ b },
101 AndNot: func(a int, b int) int { return a &^ b },
102 Mod: func(a int, b int) int { return a % b },
103
104 Shl: func(a int, b uint) int { return a << b },
105 Shr: func(a int, b uint) int { return a >> b },
106 },
107
108 Nary: intNary{
109 Add: intNaryAdd,
110 Mul: intNaryMul,
111 },
112
113 Reduce: intReduce,
114 }
115
116
117
118 var IntChecked = struct {
119 Unary intUnaryChecked
120 Binary intBinaryChecked
121 Nary intNaryChecked
122 Reduce func(operatorIdentity int, operator func(int, int) (int, error), elements ... int) (int, error)
123 }{
124 Unary: intUnaryChecked{
125 Abs: intUnaryCheckedAbs,
126 Negation: intUnaryCheckedNegation,
127 },
128
129 Binary: intBinaryChecked{
130 Add: intBinaryCheckedAdd,
131 Sub: intBinaryCheckedSub,
132 Mul: intBinaryCheckedMul,
133 Div: intBinaryCheckedDiv,
134 Shl: intBinaryCheckedShl,
135 },
136
137 Nary: intNaryChecked{
138 Add: intNaryCheckedAdd,
139 Mul: intNaryCheckedMul,
140 },
141
142 Reduce: intCheckedReduce,
143 }
144
145 func intUnaryPositive(a int) bool {
146 return a > 0
147 }
148
149 func intUnaryNegative(a int) bool {
150 return a < 0
151 }
152
153 func intUnaryAbs(a int) int {
154 if a < 0 { return -a }
155 return a
156 }
157
158 func intUnaryCheckedAbs(a int) (v int, err error) {
159 if a == minInt { return v, ErrorOverflow }
160 if a < 0 { return -a, nil }
161 return a, nil
162 }
163
164 func intUnaryCheckedNegation(a int) (v int, err error) {
165 if (a == minInt) { return v, ErrorOverflow }
166 return -a, nil
167 }
168
169 func intBinaryCheckedAdd(a int, b int) (v int, err error) {
170 if (b > 0) && (a > (maxInt - b)) { return v, ErrorOverflow }
171 if (b < 0) && (a < (minInt - b)) { return v, ErrorOverflow }
172 return a + b, nil
173 }
174
175 func intBinaryCheckedSub(a int, b int) (v int, err error) {
176 if (b < 0) && (a > (maxInt + b)) { return v, ErrorOverflow }
177 if (b > 0) && (a < (minInt + b)) { return v, ErrorOverflow }
178 return a - b, nil
179 }
180
181 func intBinaryCheckedMul(a int, b int) (v int, err error) {
182 if (a == -1) && (b == minInt) { return v, ErrorOverflow }
183 if (b == -1) && (a == minInt) { return v, ErrorOverflow }
184 if (a > (maxInt / b)) { return v, ErrorOverflow }
185 if (a < (minInt / b)) { return v, ErrorOverflow }
186
187 return a * b, nil
188 }
189
190 func intBinaryCheckedDiv(a int, b int) (v int, err error) {
191 if (b == -1) && (a == minInt) { return v, ErrorOverflow }
192 if (b == 0) { return v, ErrorUndefined }
193
194 return a / b, nil
195 }
196
197 func intBinaryCheckedShl(a int, b uint) (v int, err error) {
198 if a < 0 { return v, ErrorUndefined }
199 if b > uint(intMostSignificantBit(maxInt)) { return v, ErrorOverflow }
200 return v, err
201 }
202
203 func intMostSignificantBit(a int) (result int) {
204 for a > 0 {
205 a >>= 1
206 result++
207 }
208 return result;
209 }
210
211 func intNaryAdd(xs ... int) (result int) {
212 for i := 0; i < len(xs); i++ {
213 result += xs[i]
214 }
215 return result
216 }
217
218 func intNaryCheckedAdd(xs ... int) (result int, err error) {
219 for i := 0; i < len(xs); i++ {
220 result, err = intBinaryCheckedAdd(result, xs[i])
221 if err != nil { return result, err }
222 }
223 return result, nil
224 }
225
226 func intNaryMul(xs ... int) (result int) {
227 result = 1
228 for i := 0; i < len(xs); i++ {
229 result *= xs[i]
230 }
231 return result
232 }
233
234 func intNaryCheckedMul(xs ... int) (result int, err error) {
235 result = 1
236 for i := 0; i < len(xs); i++ {
237 result, err = intBinaryCheckedMul(result, xs[i])
238 if err != nil { return result, err }
239 }
240 return result, nil
241 }
242
243 func intReduce(operatorIdentity int, operator func(int, int) int, elements ... int) (result int) {
244 result = operatorIdentity
245 for i := 0; i < len(elements); i++ {
246 result = operator(result, elements[i])
247 }
248 return result
249 }
250
251 func intCheckedReduce(operatorIdentity int, operator func(int, int) (int, error), elements ... int) (result int, err error) {
252 result = operatorIdentity
253 for i := 0; i < len(elements); i++ {
254 result, err = operator(result, elements[i])
255 if err != nil { return result, err }
256 }
257 return result, err
258 }
259
260
View as plain text