    {-# language CPP #-}
    {-# language TypeOperators #-}
    {-# language ScopedTypeVariables #-}
    module Control.Lens.Internal.Typeable (
        eqT
      , typeRep
      ) where
    #if MIN_VERSION_base (4,7,0)
    import Data.Typeable (eqT, typeRep)

    #else

    import Data.Type.Equality
    import Data.Typeable (Typeable, TypeRep, gcast, typeOf)

    -- | Extract a witness of equality of two types
    eqT :: (Typeable a, Typeable b) => Maybe (a :~: b)
    eqT = gcast Refl

    -- | Takes a value of type @a@ and returns a concrete representation of that type.
    typeRep :: forall proxy a . Typeable a => proxy a -> TypeRep
    typeRep _ = typeOf (undefined :: a)

    #endif