spade-0.1.0.9: src/Interpreter.hs
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