{-# LANGUAGE TemplateHaskell #-}
{- | This module wraps the boxing stage. Boxing is performed to ensure that nested lists are 
   handled in a separate table in the database. 
-}
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