module Flite.CompileFrontend (frontend) where

import Flite.Syntax
import Flite.Traversals
import Flite.Matching
import Flite.Case
import Flite.Let
import Flite.Identify
import Flite.Strictify
import Flite.ConcatApp
import Flite.Inline
import Flite.Fresh
import Control.Monad

frontend :: InlineFlag -> Prog -> Prog
frontend i p = snd (runFresh (frontendM i p) "$" 0)

frontendM :: InlineFlag -> Prog -> Fresh Prog
frontendM i p =
      return (identifyFuncs p)
  >>= desugarCase
  >>= desugarEqn
  >>= inlineLinearLet
  >>= inlineSimpleLet
  >>= return . caseElim
  >>= return . concatApps
  >>= inlineTop i
  >>= return . strictifyPrim