----------------------------------------------------------------------------
-- |
-- Module      :  CSPM.Interpreter
-- Copyright   :  (c) Fontaine 2008
-- License     :  BSD
-- 
-- Maintainer  :  Fontaine@cs.uni-duesseldorf.de
-- Stability   :  experimental
-- Portability :  GHC-only
--
-- An API for the Interpreter.
--
----------------------------------------------------------------------------

module CSPM.Interpreter
(
   runFile
  ,evalTest
  ,getAllEvents
  ,prepareAST
  ,runInterpreter
  ,runInterpreterP
  ,module CSPM.Interpreter.Types
  ,module CSPM.Interpreter.Bindings
  ,module CSPM.Interpreter.CoreInstances
)
where

import CSPM.Interpreter.Types
import CSPM.Interpreter.CoreInstances ()
import CSPM.Interpreter.Bindings
import CSPM.Interpreter.Eval
import CSPM.Interpreter.Hash (hs)
import CSPM.Interpreter.PrepareAST
import CSPM.Interpreter.Test.CLI

import Language.CSPM.AST as AST

import Data.IntMap as IntMap

-- | Run the interpreter for a given module and top-level identifier.
runInterpreter :: AST.LModule -> AST.UniqueIdent -> (Value,Env)
runInterpreter ast entry
  = (getLetBindings env IntMap.! AST.uniqueIdentId entry
    ,env)
  where 
    env = processDeclList (hs "TopLevelEnvirionment") emptyEnvirionment
          $ AST.moduleDecls $ unLabel ast

-- | Run the interpreter for a given module and top-level identifier.
-- Cast result to a process
runInterpreterP :: AST.LModule -> AST.UniqueIdent -> (Process,Env)
runInterpreterP ast entry = case val of
    VProcess x -> (x,env)
    _ -> throwTypingError "entrypoint is not a CSPM-process" (Just $ AST.bindingLoc entry)
           $  Just val
  where
    env = processDeclList (hs "TopLevelEnvirionment") emptyEnvirionment
          $ AST.moduleDecls $ unLabel ast
    val :: Value
    val = (IntMap.!) (getLetBindings env) $ AST.uniqueIdentId entry