    {-# LANGUAGE Safe #-}

    -- |
    --
    -- Module      :  Data.Typeable
    -- Copyright   :  (c) The University of Glasgow, CWI 2001--2004
    -- License     :  BSD-style (see the file libraries/base/LICENSE)
    --
    -- Maintainer  :  libraries@haskell.org
    -- Stability   :  stable
    -- Portability :  portable
    --
    -- The 'Typeable' class reifies types to some extent by associating type
    -- representations to types. These type representations can be compared,
    -- and one can in turn define a type-safe cast operation. To this end,
    -- an unsafe cast is guarded by a test for type (representation)
    -- equivalence. The module "Data.Dynamic" uses Typeable for an
    -- implementation of dynamics. The module "Data.Data" uses Typeable
    -- and type-safe cast (but not dynamics) to support the \"Scrap your
    -- boilerplate\" style of generic programming.
    --
    -- == Compatibility Notes
    --
    -- Since GHC 8.2, GHC has supported type-indexed type representations.
    -- "Data.Typeable" provides type representations which are qualified over this
    -- index, providing an interface very similar to the "Typeable" notion seen in
    -- previous releases. For the type-indexed interface, see "Type.Reflection".
    --
    -- Since GHC 7.10, all types automatically have 'Typeable' instances derived.
    -- This is in contrast to previous releases where 'Typeable' had to be
    -- explicitly derived using the @DeriveDataTypeable@ language extension.
    --
    -- Since GHC 7.8, 'Typeable' is poly-kinded. The changes required for this might
    -- break some old programs involving 'Typeable'. More details on this, including
    -- how to fix your code, can be found on the
    -- <https://gitlab.haskell.org/ghc/ghc/wikis/ghc-kinds/poly-typeable PolyTypeable wiki page>
    --

    module Data.Typeable
        (-- *  The Typeable class
         Typeable,
         typeOf,
         typeRep,
         -- *  Propositional equality
         (:~:)(Refl),
         (:~~:)(HRefl),
         -- *  Type-safe cast
         cast,
         eqT,
         heqT,
         decT,
         hdecT,
         gcast,
         -- *  Generalized casts for higher-order kinds
         gcast1,
         gcast2,
         -- *  A canonical proxy type
         Proxy(..),
         -- *  Type representations
         TypeRep,
         rnfTypeRep,
         showsTypeRep,
         mkFunTy,
         -- *  Observing type representations
         funResultTy,
         splitTyConApp,
         typeRepArgs,
         typeRepTyCon,
         typeRepFingerprint,
         -- *  Type constructors
         TyCon,
         tyConPackage,
         tyConModule,
         tyConName,
         rnfTyCon,
         tyConFingerprint,
         -- *  For backwards compatibility
         typeOf1,
         typeOf2,
         typeOf3,
         typeOf4,
         typeOf5,
         typeOf6,
         typeOf7,
         trLiftedRep
         ) where

    import GHC.Internal.Data.Typeable