{-# LANGUAGE FlexibleContexts #-}

module Jikka.CPlusPlus.Convert
  ( run,
  )
where

import qualified Jikka.CPlusPlus.Convert.AddMain as AddMain
import qualified Jikka.CPlusPlus.Convert.FromCore as FromCore
import qualified Jikka.CPlusPlus.Convert.InlineSetAt as InlineSetAt
import qualified Jikka.CPlusPlus.Convert.MoveSemantics as MoveSemantics
import qualified Jikka.CPlusPlus.Convert.OptimizeRange as OptimizeRange
import qualified Jikka.CPlusPlus.Convert.UnpackTuples as UnpackTuples
import qualified Jikka.CPlusPlus.Convert.UseInitialization as UseInitialization
import qualified Jikka.CPlusPlus.Language.Expr as Y
import Jikka.Common.Alpha
import Jikka.Common.Error
import Jikka.Common.IOFormat
import qualified Jikka.Core.Language.Expr as X

run :: (MonadAlpha m, MonadError Error m) => X.Program -> Maybe IOFormat -> m Y.Program
run :: Program -> Maybe IOFormat -> m Program
run Program
prog Maybe IOFormat
format = do
  Program
prog <- Program -> m Program
forall (m :: * -> *).
(MonadAlpha m, MonadError Error m) =>
Program -> m Program
FromCore.run Program
prog
  let go :: Program -> m Program
go Program
prog = do
        Program
prog <- Program -> m Program
forall (m :: * -> *).
(MonadAlpha m, MonadError Error m) =>
Program -> m Program
UnpackTuples.run Program
prog
        Program
prog <- Program -> m Program
forall (m :: * -> *). MonadError Error m => Program -> m Program
MoveSemantics.run Program
prog
        Program -> m Program
forall (m :: * -> *).
(MonadAlpha m, MonadError Error m) =>
Program -> m Program
OptimizeRange.run Program
prog
  Program
prog <- Program -> m Program
forall (m :: * -> *).
(MonadAlpha m, MonadError Error m) =>
Program -> m Program
go Program
prog
  Program
prog <- Program -> m Program
forall (m :: * -> *).
(MonadAlpha m, MonadError Error m) =>
Program -> m Program
go Program
prog
  Program
prog <- Program -> m Program
forall (m :: * -> *).
(MonadAlpha m, MonadError Error m) =>
Program -> m Program
InlineSetAt.run Program
prog
  Program
prog <- Program -> m Program
forall (m :: * -> *).
(MonadAlpha m, MonadError Error m) =>
Program -> m Program
go Program
prog
  Program
prog <- m Program -> (IOFormat -> m Program) -> Maybe IOFormat -> m Program
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Program -> m Program
forall (m :: * -> *) a. Monad m => a -> m a
return Program
prog) (Program -> IOFormat -> m Program
forall (m :: * -> *).
(MonadAlpha m, MonadError Error m) =>
Program -> IOFormat -> m Program
AddMain.run Program
prog) Maybe IOFormat
format
  Program -> m Program
forall (m :: * -> *).
(MonadAlpha m, MonadError Error m) =>
Program -> m Program
UseInitialization.run Program
prog