packages feed

hypertypes-0.1.0.1: src/Hyper/Type/AST/FuncType.hs

{-# 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