diff options
author | dan <[email protected]> | 2024-04-20 15:20:38 -0400 |
---|---|---|
committer | dan <[email protected]> | 2024-04-20 15:20:38 -0400 |
commit | 04bee80d603f813731f5db9a46f30aba9b7852f2 (patch) | |
tree | 781937cac742e0460c92918e85b98c885bfae153 | |
parent | 7085e9f67ac470cea790232513cd465ee7443e70 (diff) | |
download | bizexp-04bee80d603f813731f5db9a46f30aba9b7852f2.tar.gz bizexp-04bee80d603f813731f5db9a46f30aba9b7852f2.tar.bz2 bizexp-04bee80d603f813731f5db9a46f30aba9b7852f2.zip |
chore: remove unused MyLib.hs file
-rwxr-xr-x | src/MyLib.hs | 95 |
1 files changed, 0 insertions, 95 deletions
diff --git a/src/MyLib.hs b/src/MyLib.hs deleted file mode 100755 index c8dc95d..0000000 --- a/src/MyLib.hs +++ /dev/null @@ -1,95 +0,0 @@ -module BizExpr (repl, eval) where - -import Data.Maybe (fromMaybe) -import Text.Read (readMaybe) - ---import Data.Text as T - -repl :: IO () -repl = getLine >>= putStrLn . maybe "Failed to evaluate expression" show . eval >> repl - -eval :: String -> Maybe Integer -eval x = coerceTo =<< evalAst . head . fst =<< parseLevel x - -data Value = IntVal Integer | StrVal String | BoolVal Bool - deriving (Show) - -class CoerceTo a where - coerceTo :: Value -> Maybe a - coerceFrom :: a -> Value - -instance CoerceTo Integer where - coerceTo (IntVal n) = Just n - coerceTo (StrVal s) = readMaybe s - coerceTo (BoolVal True) = Just 1 - coerceTo (BoolVal False) = Just 0 - - coerceFrom = IntVal - -instance CoerceTo Bool where - coerceTo (BoolVal v) = Just v - coerceTo (IntVal v) = Just $ v /= 0 - coerceTo (StrVal "True") = Just True - coerceTo (StrVal "true") = Just True - coerceTo v = coerceTo . IntVal =<< (coerceTo v :: Maybe Integer) :: Maybe Bool - - coerceFrom = BoolVal - -type Name = String - -data Ast - = Expr Name [Ast] - | Val Value - deriving (Show) - -parseLevel :: String -> Maybe ([Ast], String) -parseLevel = go "" (Just []) - where - go :: String -> Maybe [Ast] -> String -> Maybe ([Ast], String) - go prev (Just l) ('(' : next) = case parseLevel next of - Nothing -> - Nothing - Just (arg, remnant) -> - let r = if remnant /= "" && head remnant == ',' then tail remnant else remnant - in go "" (Just (l ++ [Expr prev arg])) r - go prev (Just l) (')' : remnant) = - let l0 = [Val $ StrVal prev | prev /= ""] - in Just (l ++ l0, remnant) - go prev (Just l) (',' : next) = - let l0 = [Val $ StrVal prev] - in go "" (Just (l ++ l0)) next - go "" (Just l) "" = - Just (l, "") - go prev (Just l) "" = - Just (l ++ [Val $ StrVal prev], "") - go prev l (x : xs) = - go (prev ++ [x]) l xs - -evalAst :: Ast -> Maybe Value -evalAst (Expr name ast) = fromMaybe Nothing (getFunc name <*> evalLevel ast) -evalAst (Val val) = Just val - -evalLevel :: [Ast] -> Maybe [Value] -evalLevel = mapM evalAst - -getFunc :: String -> Maybe ([Value] -> Maybe Value) -getFunc "sum" = Just eSum -getFunc "any" = Just eAny -getFunc "all" = Just eAll -getFunc _ = Nothing - -eSum :: [Value] -> Maybe Value -eSum = eFold (+) (0 :: Integer) - -eAny :: [Value] -> Maybe Value -eAny = eFold (||) False - -eAll :: [Value] -> Maybe Value -eAll = eFold (&&) True - -eFold :: (CoerceTo a, CoerceTo b) => (b -> a -> b) -> b -> [Value] -> Maybe Value -eFold fn init [] = Just $ coerceFrom init -eFold fn init (x : xs) = - let b = coerceTo =<< eFold fn init xs - a = coerceTo x - in coerceFrom <$> (fn <$> b <*> a) |