packages feed

lol-typing-1.20160822: Language/LOL/Typing/Expr/Utils.hs

{-# OPTIONS_GHC -fno-warn-orphans #-}
module Language.LOL.Typing.Expr.Utils where

import Data.Function (($), (.))
import Data.Maybe (Maybe(..))
import Data.String (IsString(..))

import Language.LOL.Typing.Type
import Language.LOL.Typing.Expr.Common
import Language.LOL.Typing.Expr.Grammar

-- Convenient instances

instance IsString Expr where
	fromString = Expr_Var . fromString

-- * Convenient 'Expr' constructors

(.->) :: Name -> Expr -> Expr
(.->) = Expr_Abst Nothing
infixr 0 .->
(..->) :: (Name, Monotype) -> Expr -> Expr
(..->) (name, sig) = Expr_Abst (Just sig) name
infixr 0 ..->

(.:) :: Polytypeable sig => Expr -> sig -> Expr
(.:) e = Expr_Annot e . polytype
infixr 0 .:

(.=) :: Name -> Expr -> Expr -> Expr
(.=) = Expr_Let Nothing
infixr 2 .=
(..=) :: Polytypeable sig => (Name, sig) -> Expr -> Expr -> Expr
(..=) (name, sig) = Expr_Let (Just $ polytype sig) name
infixr 2 ..=

(!) :: Expr -> Expr -> Expr
(!) = Expr_App
infixl 5 !

(.$) :: Expr -> Expr -> Expr
(.$) = Expr_App
infixr 3 .$