#include "macros.h"
LANGUAGE_POLYKINDS
LANGUAGE_AUTODERIVETYPEABLE
LANGUAGE_ALLOWAMBIGUOUSTYPES
LANGUAGE_TRUSTWORTHY
module Type.Eq where
import Control.Category (Category(..))
import Control.Applicative (Applicative)
import Data.Typeable (Typeable, gcast)
#if __GLASGOW_HASKELL__ < 707
import Data.Typeable (Typeable2, typeOf2, mkTyConApp)
#endif
#if __GLASGOW_HASKELL__ >= 701
import Data.Typeable (mkTyCon3)
#else
import Data.Typeable (mkTyCon)
#endif
import Type.Eq.Unsafe
import Prelude hiding ((.))
import Unsafe.Coerce
data a :~: b where
Eq :: (a ~ b) => a :~: b
#if __GLASGOW_HASKELL__ < 707
instance Typeable2 (:~:) where
typeOf2 = const $ mkTyConApp tyCon []
where tyCon = MK_TY_CON("Type.Eq",":~:")
#endif
withEq :: (a ~ b => r) -> (a :~: b) -> r
withEq x Eq = x
instance Category (:~:) where
id = idEq
(.) = composeEq
idEq :: a :~: a
idEq = Eq
composeEq :: (b :~: c) -> (a :~: b) -> (a :~: c)
composeEq Eq Eq = Eq
flipEq :: (a :~: b) -> (b :~: a)
flipEq Eq = Eq
argumentEq :: (f a :~: g b) -> (a :~: b)
argumentEq Eq = BUG_5591(Eq)
cast, (|>) :: a -> (a :~: b) -> b
cast a Eq = a
(|>) = cast
data OuterEq f a where
OuterEq :: f i ~ a => OuterEq f a
data InnerEq i a where
InnerEq :: f i ~ a => InnerEq i a
withOuterEq :: (forall i. f i ~ a => r) -> OuterEq f a -> r
withOuterEq x OuterEq = x
withInnerEq :: (forall f. f i ~ a => r) -> InnerEq i a -> r
withInnerEq x InnerEq = x
outerEq :: f i :~: a -> OuterEq f a
outerEq Eq = OuterEq
innerEq :: f i :~: a -> InnerEq i a
innerEq Eq = InnerEq
assembleEq :: OuterEq f a -> InnerEq i a -> f i :~: a
assembleEq OuterEq InnerEq = BUG_5591(Eq)
sameInnerEq :: InnerEq i a -> InnerEq j a -> i :~: j
sameInnerEq InnerEq InnerEq = BUG_5591(Eq)
dynamicEq :: (Typeable a, Typeable b) => Maybe (a :~: b)
dynamicEq = gcast idEq
class TypeCompare t where
maybeEq, (~~) :: t a -> t b -> Maybe (a :~: b)
maybeOuterEq, (~>) :: t (f i) -> t a -> Maybe (OuterEq f a)
maybeInnerEq, (<~) :: t (f i) -> t a -> Maybe (InnerEq i a)
piecewiseMaybeEq, (<~>) :: t (f i) -> t a -> (Maybe (OuterEq f a), Maybe (InnerEq i a))
maybeEq = (~~)
(~~) = maybeEq
maybeOuterEq a b = fst (a <~> b)
maybeInnerEq a b = snd (a <~> b)
piecewiseMaybeEq a b = (a ~> b, a <~ b)
(~>) = maybeOuterEq
(<~) = maybeInnerEq
(<~>) = piecewiseMaybeEq
instance TypeCompare ((:~:) a) where
maybeEq Eq Eq = Just Eq
maybeOuterEq Eq Eq = Just OuterEq
maybeInnerEq Eq Eq = Just InnerEq
instance TypeCompare (InnerEq i) where
maybeEq _ _ = Nothing
maybeOuterEq _ _ = Nothing
maybeInnerEq InnerEq InnerEq = Just BUG_5591(InnerEq)
instance TypeCompare (OuterEq f) where
maybeEq _ _ = Nothing
maybeOuterEq OuterEq OuterEq = Just BUG_5591(OuterEq)
maybeInnerEq _ _ = Nothing