aboutsummaryrefslogtreecommitdiffstats
path: root/src/BizExpr.hs
diff options
context:
space:
mode:
authordan <[email protected]>2021-04-17 08:41:13 +0200
committerdan <[email protected]>2021-04-17 08:41:13 +0200
commit766bc25be87ad66d9c850373e42c7d323f8d58db (patch)
treefad231549184eda76e03e40ddfab74c234db2960 /src/BizExpr.hs
parenta26253c1efe45459b46edd4d06a4ee03d99eb6dd (diff)
downloadbizexp-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.hs32
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)