-----------------------------------------------------------------------------
-- |
-- Module      : Berp.Compile.HsSyntaxUtils
-- Copyright   : (c) 2010 Bernie Pope
-- License     : BSD-style
-- Maintainer  : florbitous@gmail.com
-- Stability   : experimental
-- Portability : ghc
--
-- Utilities for processing Haskell syntax.
--
-----------------------------------------------------------------------------

module Berp.Compile.HsSyntaxUtils  where

import Language.Haskell.Exts.Syntax
import Language.Haskell.Exts.Build
import Berp.Compile.PrimName as Prim

bogusSrcLoc :: SrcLoc
bogusSrcLoc = SrcLoc { srcFilename = "", srcLine = -1, srcColumn = -1 }

class Parens a where
   parens :: a -> a

-- not exhaustive
instance Parens Exp where
   parens e@(Var {}) = e
   parens e@(IPVar {}) = e
   parens e@(Con {}) = e
   parens e@(Lit {}) = e
   parens e@(Tuple {}) = e
   parens e@(List {}) = e
   parens e@(Paren {}) = e
   parens e@(ListComp {}) = e
   parens e = paren e

-- turn a list of statements into a do block, avoiding redundant do.
doBlock :: [Stmt] -> Exp
doBlock [Qualifier e] = e
doBlock stmts = doE stmts

conditional :: Exp -> Exp -> Exp -> Exp
conditional cond trueBranch falseBranch
   = appFun Prim.ite [parens cond, parens trueBranch, parens falseBranch]

