packages feed

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