{-# 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 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 = map run examplePrograms

main = sequence_ $ map print $ exampleRuns

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

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
         )