<- Back to shtanton's homepage
aboutsummaryrefslogtreecommitdiff
path: root/subex/arithmetic.go
diff options
context:
space:
mode:
Diffstat (limited to 'subex/arithmetic.go')
-rw-r--r--subex/arithmetic.go24
1 files changed, 24 insertions, 0 deletions
diff --git a/subex/arithmetic.go b/subex/arithmetic.go
index 4404a1c..52f576d 100644
--- a/subex/arithmetic.go
+++ b/subex/arithmetic.go
@@ -152,3 +152,27 @@ func reciprocalValues(atoms []walk.Atom) ([]walk.Atom, error) {
}
return reciprocals, nil
}
+
+// If all are castable to booleans, NOTs all and returns them
+// Else errors
+func notValues(atoms []walk.Atom) (notted []walk.Atom, err error) {
+ values, err := walk.MemoryCompound(atoms)
+ if err != nil {
+ return nil, err
+ }
+ for _, value := range values {
+ switch v := value.(type) {
+ case walk.ValueNull:
+ notted = append(notted, walk.ValueBool(true))
+ case walk.ValueBool:
+ notted = append(notted, walk.ValueBool(!v))
+ case walk.ValueNumber:
+ notted = append(notted, walk.ValueBool(v == 0))
+ case walk.ValueString:
+ notted = append(notted, walk.ValueBool(len(v) == 0))
+ default:
+ return nil, errors.New("Tried to NOT non-boolean")
+ }
+ }
+ return notted, nil
+}