diff options
author | dan <[email protected]> | 2021-04-17 08:41:13 +0200 |
---|---|---|
committer | dan <[email protected]> | 2021-04-17 08:41:13 +0200 |
commit | 766bc25be87ad66d9c850373e42c7d323f8d58db (patch) | |
tree | fad231549184eda76e03e40ddfab74c234db2960 /src/BizExpr.hs | |
parent | a26253c1efe45459b46edd4d06a4ee03d99eb6dd (diff) | |
download | bizexp-766bc25be87ad66d9c850373e42c7d323f8d58db.tar.gz bizexp-766bc25be87ad66d9c850373e42c7d323f8d58db.tar.bz2 bizexp-766bc25be87ad66d9c850373e42c7d323f8d58db.zip |
Create RestService, with state and an eval endpoint
Diffstat (limited to 'src/BizExpr.hs')
-rw-r--r-- | src/BizExpr.hs | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/src/BizExpr.hs b/src/BizExpr.hs index c297da6..0ccfcd3 100644 --- a/src/BizExpr.hs +++ b/src/BizExpr.hs @@ -1,3 +1,5 @@ +{-# LANGUAGE FlexibleInstances #-} + module BizExpr (repl, eval) where import Data.Maybe (fromMaybe) @@ -6,9 +8,9 @@ import Text.Read (readMaybe) --import Data.Text as T repl :: IO () -repl = getLine >>= putStrLn . maybe "Failed to evaluate expression" show . eval >> repl +repl = getLine >>= putStrLn . maybe "Failed to evaluate expression" show . (eval :: String -> Maybe Integer) >> repl -eval :: String -> Maybe Integer +eval :: CoerceTo a => String -> Maybe a eval x = coerceTo =<< evalAst . head . fst =<< parseLevel x data Value = IntVal Integer | StrVal String | BoolVal Bool @@ -26,12 +28,18 @@ instance CoerceTo Integer where coerceFrom = IntVal +instance CoerceTo String where + coerceTo (BoolVal v) = Just $ show v + coerceTo (IntVal v) = Just $ show v + coerceTo (StrVal v) = Just v + coerceFrom = StrVal + 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 (BoolVal v) = Just v - coerceTo _ = Just False + coerceTo v = coerceTo . IntVal =<< coerceTo v coerceFrom = BoolVal @@ -46,12 +54,16 @@ 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) ('(' : 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) |