Allows strings and lists to be compared with null

This commit is contained in:
John Wiegley 2018-04-05 23:50:22 -07:00
parent 7df47c7d11
commit 323068f6ec

View file

@ -157,6 +157,16 @@ eval (NBinary op larg rarg) = case op of
NGte -> valueRefBool $ ls >= rs
_ -> throwError unsupportedTypes
(NVStr _ _, NVConstant NNull) -> case op of
NEq -> valueRefBool =<< valueEq lval (NVStr "" mempty)
NNEq -> valueRefBool . not =<< valueEq lval (NVStr "" mempty)
_ -> throwError unsupportedTypes
(NVConstant NNull, NVStr _ _) -> case op of
NEq -> valueRefBool =<< valueEq (NVStr "" mempty) rval
NNEq -> valueRefBool . not =<< valueEq (NVStr "" mempty) rval
_ -> throwError unsupportedTypes
(NVSet ls lp, NVSet rs rp) -> case op of
NUpdate -> return $ NVSet (rs `M.union` ls) (rp `M.union` lp)
NEq -> valueRefBool =<< valueEq lval rval
@ -169,6 +179,18 @@ eval (NBinary op larg rarg) = case op of
NNEq -> valueRefBool . not =<< valueEq lval rval
_ -> throwError unsupportedTypes
(NVList ls, NVConstant NNull) -> case op of
NConcat -> return $ NVList ls
NEq -> valueRefBool =<< valueEq lval (NVList [])
NNEq -> valueRefBool . not =<< valueEq lval (NVList [])
_ -> throwError unsupportedTypes
(NVConstant NNull, NVList rs) -> case op of
NConcat -> return $ NVList rs
NEq -> valueRefBool =<< valueEq (NVList []) rval
NNEq -> valueRefBool . not =<< valueEq (NVList []) rval
_ -> throwError unsupportedTypes
(NVLiteralPath ls, NVLiteralPath rs) -> case op of
-- TODO: Canonicalise path
NPlus -> NVLiteralPath <$> makeAbsolutePath (ls ++ rs)
@ -320,6 +342,8 @@ valueEq l r = case (l, r) of
(NVConstant (NUri lu), NVStr rs _) -> pure $ lu == rs
(NVConstant lc, NVConstant rc) -> pure $ lc == rc
(NVStr ls _, NVStr rs _) -> pure $ ls == rs
(NVStr ls _, NVConstant NNull) -> pure $ ls == ""
(NVConstant NNull, NVStr rs _) -> pure $ "" == rs
(NVList ls, NVList rs) -> alignEqM thunkEq ls rs
(NVSet lm _, NVSet rm _) -> alignEqM thunkEq lm rm
(NVLiteralPath lp, NVLiteralPath rp) -> pure $ lp == rp