diff --git a/Nix/Builtins.hs b/Nix/Builtins.hs index 54ec6f7..a3b7117 100644 --- a/Nix/Builtins.hs +++ b/Nix/Builtins.hs @@ -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