descript-lang-0.2.0.0: src/Descript/Build/Build.hs
{-# LANGUAGE MonoLocalBinds #-}
-- | Organizes all the phases.
-- Allows builting and interpreting a program, without exposing any
-- particular phase information -- should maybe be 'Descript.Build.Interface'.
module Descript.Build.Build
( compile
, eval
, interpret
) where
import Descript.Build.Error
import Descript.Build.Read
import qualified Descript.BasicInj.Data.Value.Reg as BasicInj
import qualified Descript.BasicInj as BasicInj
import Descript.Misc
import Data.Text (Text)
import Control.Monad
import Core.Control.Monad.Trans
-- TODO In future versions, refine "output":
-- look at the reduced value. If it's a datum, output it. If it's a
-- compiled program, output it (maybe in a 'Compiled' structure).
-- Maybe if it's some other "datum"-y record types, output it.
--
-- | Parses, interprets, and compiles a source file.
compile :: (Monad u) => DFile u -> BuildResultT u Package
compile file = compileB file =<< interpret file
compileB :: (Monad u) => DFile u -> BasicInj.Value () -> BuildResultT u Package
compileB file
= hoist . mapError BuildCompileError . BasicInj.compile (fileName file)
-- | Parses, interprets, and prints a source file.
eval :: (Monad u) => DFile u -> BuildResultT u Text
eval = fmap pprint . interpret
-- | Parses and interprets a source file.
interpret :: (Monad u) => DFile u -> BuildResultT u (BasicInj.Value ())
interpret = interpretB . sourceToProgramB <=< validateB <=< readB
where interpretB = fmap BasicInj.interpret_
sourceToProgramB = maybeToResultT BuildExpectedProgramError . traverse BasicInj.sourceToProgram
validateB = mapErrorT BuildValidateError . hoist . BasicInj.validate
readB = mapErrorT BuildParseError . readSrc