|
1 | 1 | package vibes |
2 | 2 |
|
3 | 3 | import ( |
4 | | - "errors" |
5 | 4 | "fmt" |
6 | 5 | "math" |
7 | | - "slices" |
8 | | - "time" |
9 | 6 | ) |
10 | 7 |
|
11 | 8 | func valueToHashKey(val Value) (string, error) { |
@@ -180,231 +177,3 @@ func floatToInt64Checked(v float64, method string) (int64, error) { |
180 | 177 | } |
181 | 178 | return int64(v), nil |
182 | 179 | } |
183 | | - |
184 | | -func addValues(left, right Value) (Value, error) { |
185 | | - switch { |
186 | | - case left.Kind() == KindInt && right.Kind() == KindInt: |
187 | | - return NewInt(left.Int() + right.Int()), nil |
188 | | - case (left.Kind() == KindInt || left.Kind() == KindFloat) && (right.Kind() == KindInt || right.Kind() == KindFloat): |
189 | | - return NewFloat(left.Float() + right.Float()), nil |
190 | | - case left.Kind() == KindTime && right.Kind() == KindDuration: |
191 | | - return NewTime(left.Time().Add(time.Duration(right.Duration().Seconds()) * time.Second)), nil |
192 | | - case right.Kind() == KindTime && left.Kind() == KindDuration: |
193 | | - return NewTime(right.Time().Add(time.Duration(left.Duration().Seconds()) * time.Second)), nil |
194 | | - case left.Kind() == KindDuration && right.Kind() == KindDuration: |
195 | | - return NewDuration(Duration{seconds: left.Duration().Seconds() + right.Duration().Seconds()}), nil |
196 | | - case left.Kind() == KindDuration && (right.Kind() == KindInt || right.Kind() == KindFloat): |
197 | | - secs, err := valueToInt64(right) |
198 | | - if err != nil { |
199 | | - return NewNil(), fmt.Errorf("unsupported addition operands") |
200 | | - } |
201 | | - return NewDuration(Duration{seconds: left.Duration().Seconds() + secs}), nil |
202 | | - case right.Kind() == KindDuration && (left.Kind() == KindInt || left.Kind() == KindFloat): |
203 | | - secs, err := valueToInt64(left) |
204 | | - if err != nil { |
205 | | - return NewNil(), fmt.Errorf("unsupported addition operands") |
206 | | - } |
207 | | - return NewDuration(Duration{seconds: right.Duration().Seconds() + secs}), nil |
208 | | - case left.Kind() == KindArray && right.Kind() == KindArray: |
209 | | - lArr := left.Array() |
210 | | - rArr := right.Array() |
211 | | - out := make([]Value, len(lArr)+len(rArr)) |
212 | | - copy(out, lArr) |
213 | | - copy(out[len(lArr):], rArr) |
214 | | - return NewArray(out), nil |
215 | | - case left.Kind() == KindString || right.Kind() == KindString: |
216 | | - return NewString(left.String() + right.String()), nil |
217 | | - case left.Kind() == KindMoney && right.Kind() == KindMoney: |
218 | | - sum, err := left.Money().add(right.Money()) |
219 | | - if err != nil { |
220 | | - return NewNil(), err |
221 | | - } |
222 | | - return NewMoney(sum), nil |
223 | | - default: |
224 | | - return NewNil(), fmt.Errorf("unsupported addition operands") |
225 | | - } |
226 | | -} |
227 | | - |
228 | | -func subtractValues(left, right Value) (Value, error) { |
229 | | - switch { |
230 | | - case left.Kind() == KindInt && right.Kind() == KindInt: |
231 | | - return NewInt(left.Int() - right.Int()), nil |
232 | | - case (left.Kind() == KindInt || left.Kind() == KindFloat) && (right.Kind() == KindInt || right.Kind() == KindFloat): |
233 | | - return NewFloat(left.Float() - right.Float()), nil |
234 | | - case left.Kind() == KindTime && right.Kind() == KindDuration: |
235 | | - return NewTime(left.Time().Add(-time.Duration(right.Duration().Seconds()) * time.Second)), nil |
236 | | - case left.Kind() == KindTime && right.Kind() == KindTime: |
237 | | - diff := left.Time().Sub(right.Time()) |
238 | | - return NewDuration(Duration{seconds: int64(diff / time.Second)}), nil |
239 | | - case left.Kind() == KindDuration && right.Kind() == KindDuration: |
240 | | - return NewDuration(Duration{seconds: left.Duration().Seconds() - right.Duration().Seconds()}), nil |
241 | | - case left.Kind() == KindDuration && (right.Kind() == KindInt || right.Kind() == KindFloat): |
242 | | - secs, err := valueToInt64(right) |
243 | | - if err != nil { |
244 | | - return NewNil(), fmt.Errorf("unsupported subtraction operands") |
245 | | - } |
246 | | - return NewDuration(Duration{seconds: left.Duration().Seconds() - secs}), nil |
247 | | - case left.Kind() == KindArray && right.Kind() == KindArray: |
248 | | - lArr := left.Array() |
249 | | - rArr := right.Array() |
250 | | - out := make([]Value, 0, len(lArr)) |
251 | | - for _, item := range lArr { |
252 | | - found := slices.ContainsFunc(rArr, item.Equal) |
253 | | - if !found { |
254 | | - out = append(out, item) |
255 | | - } |
256 | | - } |
257 | | - return NewArray(out), nil |
258 | | - case left.Kind() == KindMoney && right.Kind() == KindMoney: |
259 | | - diff, err := left.Money().sub(right.Money()) |
260 | | - if err != nil { |
261 | | - return NewNil(), err |
262 | | - } |
263 | | - return NewMoney(diff), nil |
264 | | - default: |
265 | | - return NewNil(), fmt.Errorf("unsupported subtraction operands") |
266 | | - } |
267 | | -} |
268 | | - |
269 | | -func multiplyValues(left, right Value) (Value, error) { |
270 | | - switch { |
271 | | - case left.Kind() == KindInt && right.Kind() == KindInt: |
272 | | - return NewInt(left.Int() * right.Int()), nil |
273 | | - case (left.Kind() == KindInt || left.Kind() == KindFloat) && (right.Kind() == KindInt || right.Kind() == KindFloat): |
274 | | - return NewFloat(left.Float() * right.Float()), nil |
275 | | - case left.Kind() == KindDuration && (right.Kind() == KindInt || right.Kind() == KindFloat): |
276 | | - secs, err := valueToInt64(right) |
277 | | - if err != nil { |
278 | | - return NewNil(), fmt.Errorf("unsupported multiplication operands") |
279 | | - } |
280 | | - return NewDuration(Duration{seconds: left.Duration().Seconds() * secs}), nil |
281 | | - case right.Kind() == KindDuration && (left.Kind() == KindInt || left.Kind() == KindFloat): |
282 | | - secs, err := valueToInt64(left) |
283 | | - if err != nil { |
284 | | - return NewNil(), fmt.Errorf("unsupported multiplication operands") |
285 | | - } |
286 | | - return NewDuration(Duration{seconds: right.Duration().Seconds() * secs}), nil |
287 | | - case left.Kind() == KindMoney && right.Kind() == KindInt: |
288 | | - return NewMoney(left.Money().mulInt(right.Int())), nil |
289 | | - case left.Kind() == KindInt && right.Kind() == KindMoney: |
290 | | - return NewMoney(right.Money().mulInt(left.Int())), nil |
291 | | - default: |
292 | | - return NewNil(), fmt.Errorf("unsupported multiplication operands") |
293 | | - } |
294 | | -} |
295 | | - |
296 | | -func divideValues(left, right Value) (Value, error) { |
297 | | - switch { |
298 | | - case (left.Kind() == KindInt || left.Kind() == KindFloat) && (right.Kind() == KindInt || right.Kind() == KindFloat): |
299 | | - if right.Float() == 0 { |
300 | | - return NewNil(), errors.New("division by zero") |
301 | | - } |
302 | | - return NewFloat(left.Float() / right.Float()), nil |
303 | | - case left.Kind() == KindDuration && right.Kind() == KindDuration: |
304 | | - if right.Duration().Seconds() == 0 { |
305 | | - return NewNil(), errors.New("division by zero") |
306 | | - } |
307 | | - return NewFloat(float64(left.Duration().Seconds()) / float64(right.Duration().Seconds())), nil |
308 | | - case left.Kind() == KindDuration && (right.Kind() == KindInt || right.Kind() == KindFloat): |
309 | | - secs, err := valueToInt64(right) |
310 | | - if err != nil { |
311 | | - return NewNil(), fmt.Errorf("unsupported division operands") |
312 | | - } |
313 | | - if secs == 0 { |
314 | | - return NewNil(), errors.New("division by zero") |
315 | | - } |
316 | | - return NewDuration(Duration{seconds: left.Duration().Seconds() / secs}), nil |
317 | | - case left.Kind() == KindMoney && right.Kind() == KindInt: |
318 | | - res, err := left.Money().divInt(right.Int()) |
319 | | - if err != nil { |
320 | | - return NewNil(), err |
321 | | - } |
322 | | - return NewMoney(res), nil |
323 | | - default: |
324 | | - return NewNil(), fmt.Errorf("unsupported division operands") |
325 | | - } |
326 | | -} |
327 | | - |
328 | | -func moduloValues(left, right Value) (Value, error) { |
329 | | - if left.Kind() == KindInt && right.Kind() == KindInt { |
330 | | - if right.Int() == 0 { |
331 | | - return NewNil(), errors.New("modulo by zero") |
332 | | - } |
333 | | - return NewInt(left.Int() % right.Int()), nil |
334 | | - } |
335 | | - if left.Kind() == KindDuration && right.Kind() == KindDuration { |
336 | | - if right.Duration().Seconds() == 0 { |
337 | | - return NewNil(), errors.New("modulo by zero") |
338 | | - } |
339 | | - return NewDuration(Duration{seconds: left.Duration().Seconds() % right.Duration().Seconds()}), nil |
340 | | - } |
341 | | - return NewNil(), fmt.Errorf("unsupported modulo operands") |
342 | | -} |
343 | | - |
344 | | -func compareValues(expr *BinaryExpr, left, right Value, cmp func(int) bool) (Value, error) { |
345 | | - switch { |
346 | | - case left.Kind() == KindInt && right.Kind() == KindInt: |
347 | | - diff := left.Int() - right.Int() |
348 | | - switch { |
349 | | - case diff < 0: |
350 | | - return NewBool(cmp(-1)), nil |
351 | | - case diff > 0: |
352 | | - return NewBool(cmp(1)), nil |
353 | | - default: |
354 | | - return NewBool(cmp(0)), nil |
355 | | - } |
356 | | - case (left.Kind() == KindInt || left.Kind() == KindFloat) && (right.Kind() == KindInt || right.Kind() == KindFloat): |
357 | | - lf, rf := left.Float(), right.Float() |
358 | | - switch { |
359 | | - case lf < rf: |
360 | | - return NewBool(cmp(-1)), nil |
361 | | - case lf > rf: |
362 | | - return NewBool(cmp(1)), nil |
363 | | - default: |
364 | | - return NewBool(cmp(0)), nil |
365 | | - } |
366 | | - case left.Kind() == KindString && right.Kind() == KindString: |
367 | | - switch { |
368 | | - case left.String() < right.String(): |
369 | | - return NewBool(cmp(-1)), nil |
370 | | - case left.String() > right.String(): |
371 | | - return NewBool(cmp(1)), nil |
372 | | - default: |
373 | | - return NewBool(cmp(0)), nil |
374 | | - } |
375 | | - case left.Kind() == KindMoney && right.Kind() == KindMoney: |
376 | | - if left.Money().Currency() != right.Money().Currency() { |
377 | | - return NewNil(), fmt.Errorf("money currency mismatch for comparison") |
378 | | - } |
379 | | - diff := left.Money().Cents() - right.Money().Cents() |
380 | | - switch { |
381 | | - case diff < 0: |
382 | | - return NewBool(cmp(-1)), nil |
383 | | - case diff > 0: |
384 | | - return NewBool(cmp(1)), nil |
385 | | - default: |
386 | | - return NewBool(cmp(0)), nil |
387 | | - } |
388 | | - case left.Kind() == KindDuration && right.Kind() == KindDuration: |
389 | | - diff := left.Duration().Seconds() - right.Duration().Seconds() |
390 | | - switch { |
391 | | - case diff < 0: |
392 | | - return NewBool(cmp(-1)), nil |
393 | | - case diff > 0: |
394 | | - return NewBool(cmp(1)), nil |
395 | | - default: |
396 | | - return NewBool(cmp(0)), nil |
397 | | - } |
398 | | - case left.Kind() == KindTime && right.Kind() == KindTime: |
399 | | - switch { |
400 | | - case left.Time().Before(right.Time()): |
401 | | - return NewBool(cmp(-1)), nil |
402 | | - case left.Time().After(right.Time()): |
403 | | - return NewBool(cmp(1)), nil |
404 | | - default: |
405 | | - return NewBool(cmp(0)), nil |
406 | | - } |
407 | | - default: |
408 | | - return NewNil(), fmt.Errorf("unsupported comparison operands") |
409 | | - } |
410 | | -} |
0 commit comments