packages feed

language-ocaml-0.1.31: lib/Language/OCaml/Definitions/Parsing/ASTHelper/Exp.hs

{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE RecordWildCards #-}

module Language.OCaml.Definitions.Parsing.ASTHelper.Exp
  ( CaseOpts(..)
  , MkOpts(..)
  , apply
  , array
  , assert
  , attr
  , case'
  , coerce
  , constant
  , constraint
  , construct
  , extension
  , field
  , for
  , fun
  , function
  , ident
  , ifThenElse
  , lazy
  , let'
  , letException
  , letModule
  , match
  , mk
  , new
  , newType
  , object
  , open
  , override
  , pack
  , poly
  , record
  , send
  , sequence
  , setField
  , setInstVar
  , try
  , tuple
  , unreachable
  , variant
  , while
  ) where

import Data.Default
import Prelude                                             hiding (sequence)

import Language.OCaml.Definitions.Parsing.ASTHelper.Common
import Language.OCaml.Definitions.Parsing.ASTTypes
import Language.OCaml.Definitions.Parsing.ParseTree        as ParseTree
import Language.OCaml.Definitions.Parsing.Location

attr :: Expression -> Attribute -> Expression
attr d a = d { pexpAttributes = pexpAttributes d ++ [a] }

-- oops! case is a reserved Haskell lexeme
case' :: CaseOpts -> Pattern -> Expression -> Case
case' (CaseOpts {..}) lhs rhs = Case
  { pcLHS   = lhs
  , pcGuard = guard
  , pcRHS   = rhs
  }

data CaseOpts = CaseOpts
  { guard :: Maybe Expression
  }

instance Default CaseOpts where
  def = CaseOpts
    { guard  = Nothing
    }

mk :: MkOpts -> ExpressionDesc -> Expression
mk (MkOpts {..}) desc =
  Expression
  { pexpDesc       = desc
  , pexpLoc        = loc
  , pexpAttributes = attrs
  }

data MkOpts = MkOpts
  { attrs  :: [Attribute]
  , loc    :: Location
  }

instance Default MkOpts where
  def = MkOpts
    { attrs  = []
    , loc    = defaultLoc
    }

ident :: MkOpts -> Loc Longident -> Expression
ident (MkOpts {..}) a = mk (def { loc, attrs }) $ PexpIdent a

constant :: MkOpts -> ParseTree.Constant -> Expression
constant (MkOpts {..}) a = mk (def { loc, attrs }) $ PexpConstant a

let' :: MkOpts -> RecFlag -> [ValueBinding] -> Expression -> Expression
let' (MkOpts {..}) a b c = mk (def { loc, attrs }) $ PexpLet a b c

fun :: MkOpts -> ArgLabel -> Maybe Expression -> Pattern -> Expression -> Expression
fun (MkOpts {..}) a b c d = mk (def { loc, attrs }) $ PexpFun a b c d

function :: MkOpts -> [Case] -> Expression
function (MkOpts {..}) a = mk (def { loc, attrs }) $ PexpFunction a

apply :: MkOpts -> Expression -> [(ArgLabel, Expression)] -> Expression
apply (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpApply a b

match :: MkOpts -> Expression -> [Case]-> Expression
match (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpMatch a b

try :: MkOpts -> Expression -> [Case] -> Expression
try (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpTry a b

tuple :: MkOpts -> [Expression] -> Expression
tuple (MkOpts {..}) a = mk (def { loc, attrs }) $ PexpTuple a

construct :: MkOpts -> Loc Longident -> Maybe Expression -> Expression
construct (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpConstruct a b

variant :: MkOpts -> Label -> Maybe Expression -> Expression
variant (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpVariant a b

record :: MkOpts -> [(Loc Longident, Expression)] -> Maybe Expression -> Expression
record (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpRecord a b

field :: MkOpts -> Expression -> Loc Longident -> Expression
field (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpField a b

setField :: MkOpts -> Expression -> Loc Longident -> Expression -> Expression
setField (MkOpts {..}) a b c = mk (def { loc, attrs }) $ PexpSetField a b c

array :: MkOpts -> [Expression] -> Expression
array (MkOpts {..}) a = mk (def { loc, attrs }) $ PexpArray a

ifThenElse :: MkOpts -> Expression -> Expression -> Maybe Expression -> Expression
ifThenElse (MkOpts {..}) a b c = mk (def { loc, attrs }) $ PexpIfThenElse a b c

sequence :: MkOpts -> Expression -> Expression -> Expression
sequence (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpSequence a b

while :: MkOpts -> Expression -> Expression -> Expression
while (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpWhile a b

for :: MkOpts -> Pattern -> Expression -> Expression -> DirectionFlag -> Expression -> Expression
for (MkOpts {..}) a b c d e = mk (def { loc, attrs }) $ PexpFor a b c d e

constraint :: MkOpts -> Expression -> CoreType -> Expression
constraint (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpConstraint a b

coerce :: MkOpts -> Expression -> Maybe CoreType -> CoreType -> Expression
coerce (MkOpts {..}) a b c = mk (def { loc, attrs }) $ PexpCoerce a b c

send :: MkOpts -> Expression -> Loc Label -> Expression
send (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpSend a b

new :: MkOpts -> Loc Longident -> Expression
new (MkOpts {..}) a = mk (def { loc, attrs }) $ PexpNew a

setInstVar :: MkOpts -> Loc Label -> Expression -> Expression
setInstVar (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpSetInstVar a b

override :: MkOpts -> [(Loc Label, Expression)] -> Expression
override (MkOpts {..}) a = mk (def { loc, attrs }) $ PexpOverride a

letModule :: MkOpts -> Loc String -> ModuleExpr -> Expression -> Expression
letModule (MkOpts {..}) a b c = mk (def { loc, attrs }) $ PexpLetModule a b c

letException :: MkOpts -> ExtensionConstructor -> Expression -> Expression
letException (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpLetException a b

assert :: MkOpts -> Expression -> Expression
assert (MkOpts {..}) a = mk (def { loc, attrs }) $ PexpAssert a

lazy :: MkOpts -> Expression -> Expression
lazy (MkOpts {..}) a = mk (def { loc, attrs }) $ PexpLazy a

poly :: MkOpts -> Expression -> Maybe CoreType -> Expression
poly (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpPoly a b

object :: MkOpts -> ClassStructure -> Expression
object (MkOpts {..}) a = mk (def { loc, attrs }) $ PexpObject a

newType :: MkOpts -> Loc String -> Expression -> Expression
newType (MkOpts {..}) a b = mk (def { loc, attrs }) $ PexpNewType a b

pack :: MkOpts -> ModuleExpr -> Expression
pack (MkOpts {..}) a = mk (def { loc, attrs }) $ PexpPack a

open :: MkOpts -> OverrideFlag -> Loc Longident -> Expression -> Expression
open (MkOpts {..}) a b c = mk (def { loc, attrs }) $ PexpOpen a b c

extension :: MkOpts -> Extension -> Expression
extension (MkOpts {..}) a = mk (def { loc, attrs }) $ PexpExtension a

unreachable :: MkOpts -> () -> Expression
unreachable (MkOpts {..}) () = mk (def { loc, attrs }) PexpUnreachable