{-# LANGUAGE CPP, NoImplicitPrelude #-}
#if __GLASGOW_HASKELL__ >= 702
{-# LANGUAGE Trustworthy #-}
#endif
#if MIN_VERSION_base(4,10,0) && !(MIN_VERSION_base(4,19,0))
{-# LANGUAGE GADTs #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
#endif
module Data.Typeable.Compat (
module Base
#if MIN_VERSION_base(4,10,0)
, heqT
, decT
, hdecT
#endif
) where
import Data.Typeable as Base
#if MIN_VERSION_base(4,10,0) && !(MIN_VERSION_base(4,19,0))
import Prelude.Compat
import Data.Void (Void)
import qualified Type.Reflection.Compat as TR
#endif
#if MIN_VERSION_base(4,10,0)
# if !(MIN_VERSION_base(4,18,0))
heqT :: forall a b. (Typeable a, Typeable b) => Maybe (a :~~: b)
heqT = ta `TR.eqTypeRep` tb
where
ta = TR.typeRep :: TR.TypeRep a
tb = TR.typeRep :: TR.TypeRep b
# endif
# if !(MIN_VERSION_base(4,19,0))
decT :: forall a b. (Typeable a, Typeable b) => Either (a :~: b -> Void) (a :~: b)
decT = case hdecT @a @b of
Right HRefl -> Right Refl
Left p -> Left (\Refl -> p HRefl)
hdecT :: forall a b. (Typeable a, Typeable b) => Either (a :~~: b -> Void) (a :~~: b)
hdecT = ta `TR.decTypeRep` tb
where
ta = TR.typeRep :: TR.TypeRep a
tb = TR.typeRep :: TR.TypeRep b
# endif
#endif