{-# LANGUAGE Safe #-}
module Types.Variance (
Variance(..),
composeVariance,
paramAllowsVariance,
) where
data Variance =
Contravariant |
Invariant |
Covariant
deriving (Eq,Ord)
instance Show Variance where
show Contravariant = "contravariant"
show Invariant = "invariant"
show Covariant = "covariant"
composeVariance :: Variance -> Variance -> Variance
composeVariance Covariant Covariant = Covariant
composeVariance Contravariant Contravariant = Covariant
composeVariance Contravariant Covariant = Contravariant
composeVariance Covariant Contravariant = Contravariant
composeVariance _ _ = Invariant
paramAllowsVariance :: Variance -> Variance -> Bool
Covariant `paramAllowsVariance` Covariant = True
Contravariant `paramAllowsVariance` Contravariant = True
Invariant `paramAllowsVariance` Covariant = True
Invariant `paramAllowsVariance` Invariant = True
Invariant `paramAllowsVariance` Contravariant = True
_ `paramAllowsVariance` _ = False