    {-# LANGUAGE CPP #-}

    #ifndef MIN_VERSION_profunctors
    #define MIN_VERSION_profunctors(x,y,z) 0
    #endif

    #if (MIN_VERSION_profunctors(4,4,0)) && __GLASGOW_HASKELL__ >= 708
    #define USE_COERCE
    {-# LANGUAGE Trustworthy #-}
    {-# LANGUAGE RankNTypes #-}
    {-# LANGUAGE ScopedTypeVariables #-}
    #else
    {-# LANGUAGE Unsafe #-}
    #endif
    -----------------------------------------------------------------------------
    -- |
    -- Copyright   :  (C) 2015 Edward Kmett and Eric Mertens
    -- License     :  BSD-style (see the file LICENSE)
    -- Maintainer  :  Edward Kmett <ekmett@gmail.com>
    -- Stability   :  experimental
    -- Portability :  non-portable
    --
    -- This module provides a shim around 'coerce' that defaults to 'unsafeCoerce'
    -- on GHC < 7.8
    -----------------------------------------------------------------------------
    module Control.Lens.Internal.Coerce
      ( coerce
      , coerce'
      ) where

    #ifdef USE_COERCE

    import Data.Coerce

    coerce' :: forall a b. Coercible a b => b -> a
    coerce' = coerce (id :: a -> a)
    {-# INLINE coerce' #-}

    #else

    import Unsafe.Coerce

    coerce, coerce' :: a -> b
    coerce  = unsafeCoerce
    coerce' = unsafeCoerce
    {-# INLINE coerce #-}
    {-# INLINE coerce' #-}
    #endif