packages feed

language-dickinson-1.4.1.0: src/Language/Dickinson/Pipeline.hs

{-# LANGUAGE FlexibleContexts #-}

module Language.Dickinson.Pipeline ( checkEvalM
                                   , validateDecl
                                   ) where

import           Control.Monad.Except           (MonadError)
import           Control.Monad.State.Lazy       (MonadState)
import qualified Data.Text                      as T
import           Language.Dickinson.Check.Scope
import           Language.Dickinson.Error
import           Language.Dickinson.Eval
import           Language.Dickinson.Type
import           Language.Dickinson.TypeCheck

-- this one is faster with (*>) than 'do'
checkEvalM :: (MonadState (EvalSt a) m, MonadError (DickinsonError a) m) => [Declaration a] -> m T.Text
checkEvalM ds =
    validateDecl ds *>
    evalDickinsonAsMain ds

-- the 'do'-notation is faster than using *>
validateDecl :: (HasTyEnv s, MonadState (s a) m, MonadError (DickinsonError a) m) => [Declaration a] -> m ()
validateDecl d = do
    maybeThrow $ checkScope d
    tyTraverse d