{-# LANGUAGE FlexibleContexts #-}
module Examples where
import qualified Control.Monad.Reader   as CMR (MonadReader)
import qualified Control.Monad.State    as CMS (MonadState)
import qualified Control.Monad.Error    as CME (MonadError)
import Interpreter4

run :: String -> Either Err Integer
run s = runEval1 $ eval $ parse s

examplePrograms :: [String]
examplePrograms =
  [ "1700+38"
  , "let x=1+2; x+x"
  , "let p=new 1; let q=new 1738; !(p+1)"
  , "!p+1738"
  , "(try !p catch 0)+1738"
  , "let one = new 1; \
    \let dummy = (try ((one := 2) + !7) catch 0); \
    \!one"
  ]
exampleRuns :: [Either Err Integer]
exampleRuns = map run examplePrograms

main :: IO ()
main = mapM_ print exampleRuns
-- For reference:
-- > mapM_ f x = sequence_ $ map f x

-- --------------

evalP :: ( CMR.MonadReader Env   m
         , CMS.MonadState  Store m
         , CME.MonadError  Err   m
         ) => String -> m Value
evalP = eval . parse


run' :: String -> (Either Err Value, Either Err Value)
run' s = ( runEval1 $ evalP s
         , runEval2 $ evalP s
         )