{-# LANGUAGE UndecidableInstances, TemplateHaskell #-} module Hyper.Type.AST.FuncType ( FuncType(..), funcIn, funcOut, W_FuncType(..), MorphWitness(..) ) where import Generics.Constraints (makeDerivings, makeInstances) import Hyper import Text.PrettyPrint ((<+>)) import qualified Text.PrettyPrint as Pretty import Text.PrettyPrint.HughesPJClass (Pretty(..), maybeParens) import Text.Show.Combinators ((@|), showCon) import Hyper.Internal.Prelude -- | A term for the types of functions. Analogues to @(->)@ in Haskell. -- -- @FuncType typ@s express types of functions of @typ@. data FuncType typ h = FuncType { _funcIn :: h :# typ , _funcOut :: h :# typ } deriving Generic makeLenses ''FuncType makeZipMatch ''FuncType makeHContext ''FuncType makeHMorph ''FuncType makeHTraversableApplyAndBases ''FuncType makeDerivings [''Eq, ''Ord] [''FuncType] makeInstances [''Binary, ''NFData] [''FuncType] instance Pretty (h :# typ) => Pretty (FuncType typ h) where pPrintPrec lvl p (FuncType i o) = pPrintPrec lvl 11 i <+> Pretty.text "->" <+> pPrintPrec lvl 10 o & maybeParens (p > 10) instance Show (h :# typ) => Show (FuncType typ h) where showsPrec p (FuncType i o) = (showCon "FuncType" @| i @| o) p