diff options
author | Charlie Stanton <charlie@shtanton.xyz> | 2023-04-19 13:23:47 +0100 |
---|---|---|
committer | Charlie Stanton <charlie@shtanton.xyz> | 2023-04-19 13:27:38 +0100 |
commit | aea1a08d6a9d378137d467d3e1f1ccc40232b725 (patch) | |
tree | 680e7c913b3ea782557d51968e24d7fa5c4d450a /subex/arithmetic.go | |
parent | b48dcb0d37bd3db854927df25e6ff41d07501026 (diff) | |
download | stred-go-aea1a08d6a9d378137d467d3e1f1ccc40232b725.tar |
Adds the negate operator
Negates all of the numbers produced by its content subex
Diffstat (limited to 'subex/arithmetic.go')
-rw-r--r-- | subex/arithmetic.go | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/subex/arithmetic.go b/subex/arithmetic.go index 7200ac7..5497a68 100644 --- a/subex/arithmetic.go +++ b/subex/arithmetic.go @@ -85,3 +85,36 @@ func multiplyValues(atoms []walk.Atom) ([]walk.Atom, error) { return []walk.Atom{walk.ValueNumber(product)}, nil } } + +// Does tries to cast all to numbers and negates them +func negateValues(atoms []walk.Atom) ([]walk.Atom, error) { + var negatedNumbers []walk.Atom + values, err := walk.MemoryCompound(atoms) + if err != nil { + return nil, err + } + for _, value := range values { + switch v := value.(type) { + case walk.ValueNull: + negatedNumbers = append(negatedNumbers, walk.ValueNumber(0)) + case walk.ValueBool: + if bool(v) { + negatedNumbers = append(negatedNumbers, walk.ValueNumber(-1)) + } else { + negatedNumbers = append(negatedNumbers, walk.ValueNumber(0)) + } + case walk.ValueNumber: + negatedNumbers = append(negatedNumbers, walk.ValueNumber(-v)) + case walk.ValueString: + num, err := strconv.ParseFloat(string(v), 64) + if err == nil { + negatedNumbers = append(negatedNumbers, walk.ValueNumber(-num)) + } else { + return nil, errors.New("Tried to sum non-castable string") + } + default: + return nil, errors.New("Tried to sum non-number") + } + } + return negatedNumbers, nil +} |