    -- |
    -- Module      : Basement.Compat.Typeable
    -- License     : BSD-style
    -- Maintainer  : Nicolas Di Prima <nicolas@primetype.co.uk>
    -- Stability   : statble
    -- Portability : portable
    --
    -- conveniently provide support for legacy and modern base
    --

    {-# LANGUAGE CPP #-}

    module Basement.Compat.Typeable
        (
    #if MIN_VERSION_base(4,7,0)
          Typeable
    #else
          Typeable(..)
        , typeRep
    #endif
        ) where

    #if !MIN_VERSION_base(4,7,0)
    import Data.Proxy (Proxy(..))
    import qualified Prelude (undefined)
    #endif
    import Data.Typeable

    #if !MIN_VERSION_base(4,7,0)
    -- this function does not exist prior base 4.7
    typeRep :: Typeable a => Proxy a -> TypeRep
    typeRep = typeRep' Prelude.undefined
      where
        typeRep' :: Typeable a => a -> Proxy a -> TypeRep
        typeRep' a _ = typeOf a
        {-# INLINE typeRep' #-}
    #endif