-- | This module wraps the stage that translates ferry core into an algebraic graph
module Database.Ferry.Compiler.Stages.ToAlgebraStage (algebraPhase) where
    
import Database.Ferry.Compiler.Types
import Database.Ferry.Compiler.ExecuteStep

import Database.Ferry.Algebra(runGraph, initLoop, AlgPlan)
import Database.Ferry.Common.Data.Plans

import Database.Ferry.TypedCore.Data.Instances()
import Database.Ferry.TypedCore.Convert.CoreToAlgebra
import Database.Ferry.TypedCore.Data.Type
                                           
import Database.Ferry.TypedCore.Data.TypedCore

algebraPhase :: CoreExpr -> PhaseResult (Qual FType, AlgPlan AlgRes)
algebraPhase e = executeStep algebraStage e

algebraStage :: CompilationStep CoreExpr (Qual FType, AlgPlan AlgRes)
algebraStage = CompilationStep "ToAlg" Algebra step artefacts
    where
        step :: CoreExpr -> PhaseResult (Qual FType, AlgPlan AlgRes)
        step e = let eTy = typeOf e
                  in return $ (eTy, runGraph initLoop $ coreToAlgebra e)
        artefacts = []