----------------------------------------------------------------------------- -- | -- 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]