module Interpreter where import Prelude hiding (map) import Control.Monad.Catch (finally) import Data.IORef (newIORef) import System.Directory import Control.Concurrent.STM.TVar import Compiler.AST.Program import Control.Monad.Reader import Interpreter.Common import Interpreter.Initialize import Interpreter.Interpreter import Interpreter.Lib.SDL interpret :: (InterpreterState -> InterpreterState) -> Maybe FilePath -> Program -> IO InterpreterState interpret stFn mFp prg = do sdlWindowsRef <- newIORef [] filePath <- case mFp of Just fp -> pure fp Nothing -> getCurrentDirectory let istate = (emptyIs sdlWindowsRef) { isCurrentModulePath = Just filePath } sTVar <- newTVarIO (stFn istate) flip runReaderT sTVar $ (do loadBuiltIns interpretPassOne prg interpretPassTwo prg liftIO $ readTVarIO sTVar ) `finally` cleanupSDL