Add builtins.lessThan

This commit is contained in:
Ryan Trinkle 2018-04-01 14:17:09 -04:00
parent 14b3bc5bb6
commit f709008efa

View file

@ -95,6 +95,7 @@ builtinsList = sequence [
, add Normal "isFloat" isFloat
, add Normal "isBool" isBool
, add2 Normal "sort" sort_
, add2 Normal "lessThan" lessThan
]
where
wrap t n f = Builtin t (n, f)
@ -426,6 +427,22 @@ sort_ comparator list = forceThunk list >>= \case
False -> pure GT
v -> throwError $ "builtins.sort: expected list, got " ++ show (void v)
lessThan :: MonadBuiltins e m => NThunk m -> NThunk m -> m (NValue m)
lessThan ta tb = do
va <- forceThunk ta
vb <- forceThunk tb
let badType = throwError $ "builtins.lessThan: expected two numbers or two strings, "
++ "got " ++ show (void va) ++ " and " ++ show (void vb)
NVConstant . NBool <$> case (va, vb) of
(NVConstant ca, NVConstant cb) -> case (ca, cb) of
(NInt a, NInt b) -> pure $ a < b
(NFloat a, NInt b) -> pure $ a < fromInteger b
(NInt a, NFloat b) -> pure $ fromInteger a < b
(NFloat a, NFloat b) -> pure $ a < b
_ -> badType
(NVStr a _, NVStr b _) -> pure $ a < b
_ -> badType
newtype Prim m a = Prim { runPrim :: m a }
class ToNix a where