module TryMe where import Data.List qualified as List import Data.Map.Strict (Map) import Data.Map.Strict qualified as Map import Prelude hiding (pure, (>>=)) import TryMeDef instance TryMeModel TC where pure :: a -> TC a pure a = MkTC (\s -> (s, Right a)) (>>=) :: TC a -> (a -> TC b) -> TC b MkTC stf >>= k = error "TODO" raise :: Exception -> TC a raise e = error "TODO" reifyException :: TC a -> TC (Either Exception a) reifyException (MkTC stf1) = error "TODO" putVar :: String -> Integer -> TC () putVar v x = error "TODO" getVar :: String -> TC Integer getVar v = error "TODO" run :: Stmt -> (Map String Integer, Either Exception ()) run stmt = runWith stmt Map.empty runWith :: Stmt -> Map String Integer -> (Map String Integer, Either Exception ()) runWith stmt s0 = unTC (interp stmt) s0 -- Optional: You may find it nicer to implement this helper for expressions. -- Then interp can just use it. eval :: TryMeModel m => Expr -> m Integer eval = error "TODO" interp :: TryMeModel m => Stmt -> m () interp = error "TODO"