module Database.Ferry.Compiler.Stages.BoxingStage (boxingPhase) where
import Database.Ferry.Compiler.Types
import Database.Ferry.Compiler.ExecuteStep
import Database.Ferry.TypeSystem.Prelude
import Database.Ferry.TypedCore.Render.Dot
import Database.Ferry.Common.Render.Dot
import Database.Ferry.TypedCore.Data.TypedCore
import Database.Ferry.TypedCore.Boxing.Boxing
import Database.Ferry.Impossible
boxingPhase :: CoreExpr -> PhaseResult CoreExpr
boxingPhase e = executeStep inferStage e
inferStage :: CompilationStep CoreExpr CoreExpr
inferStage = CompilationStep "Boxing" Boxing step artefacts
where
step :: CoreExpr -> PhaseResult CoreExpr
step e = return $ runBoxing primitives e
artefacts = [(DotBox ,"dot", \s -> return $ makeDot s)]
makeDot :: CoreExpr -> String
makeDot c = case runDot $ toDot c of
Right s -> s
Left _ -> $impossible