module Language.Clafer.Intermediate.Transformer where
import Control.Lens
import Data.Maybe
import Language.Clafer.Common
import qualified Language.Clafer.Intermediate.Intclafer as I (exp, elements)
import Language.Clafer.Intermediate.Intclafer hiding (exp, elements, op)
import Language.Clafer.Intermediate.Desugarer
transModule :: IModule -> IModule
transModule = mDecls . traversed %~ transElement
transElement :: IElement -> IElement
transElement (IEClafer clafer) = IEClafer $ transClafer clafer
transElement (IEConstraint isHard' pexp) = IEConstraint isHard' $ transPExp False pexp
transElement (IEGoal isMaximize' pexp) = IEGoal isMaximize' $ transPExp False pexp
transClafer :: IClafer -> IClafer
transClafer = I.elements . traversed %~ transElement
transPExp :: Bool -> PExp -> PExp
transPExp True pexp'@(PExp iType' _ _ _) = desugarPath $ I.exp %~ transIExp (fromJust $ iType') $ pexp'
transPExp False pexp' = pexp'
transIExp :: IType -> IExp -> IExp
transIExp _ idpe@(IDeclPExp _ _ _) = bpexp %~ transPExp False $ idpe
transIExp iType' ife@(IFunExp op' _) = exps . traversed %~ transPExp cond $ ife
where
cond = op' == iIfThenElse &&
iType' `elem` [TBoolean, TClafer []]
transIExp _ iexp' = iexp'