uniplate-1.6: Data/Generics/PlateInternal.hs
{-# LANGUAGE CPP, Rank2Types, MagicHash, UnboxedTuples #-}
{- |
Internal module, do not import or use.
-}
module Data.Generics.PlateInternal(
unsafeCast, inlinePerformIO, builder, concatCont
) where
---------------------------------------------------------------------
-- GHC
{-
#if !__GLASGOW_HASKELL__
{-
#endif
-}
import GHC.Exts(unsafeCoerce#, build, realWorld#)
#if __GLASGOW_HASKELL__ < 612
import GHC.IOBase(IO(IO))
#else
import GHC.IO(IO(IO))
#endif
{-# INLINE unsafeCast #-}
-- | @unsafeCoerce@, but for all compilers. In future this can be obtained from
-- @Unsafe.Coerce.unsafeCoerce@, but thats too recent a change.
unsafeCast :: a -> b
unsafeCast = unsafeCoerce#
{-# INLINE builder #-}
-- | GHCs @foldr@\/@build@ system, but on all platforms
builder :: forall a . (forall b . (a -> b -> b) -> b -> b) -> [a]
builder = build
{-# INLINE inlinePerformIO #-}
-- | 'unsafePerformIO', but suitable for inlining. Copied from "Data.ByteString.Base".
inlinePerformIO :: IO a -> a
inlinePerformIO (IO m) = case m realWorld# of (# _, r #) -> r
{-
#if !__GLASGOW_HASKELL__
-}
#endif
-}
---------------------------------------------------------------------
-- !GHC
{-
#if !__GLASGOW_HASKELL__
-}
import Data.Typeable
import Data.Maybe
import Foreign
unsafeCast :: (Typeable a, Typeable b) => a -> b
unsafeCast = fromJust . cast
inlinePerformIO :: IO a -> a
inlinePerformIO = unsafePerformIO
builder :: ((x -> [x] -> [x]) -> [x] -> [x]) -> [x]
builder f = f (:) []
{-
#endif
-}
{-# INLINE concatCont #-}
-- | Perform concatentation of continuations
concatCont :: [a -> a] -> a -> a
concatCont xs rest = foldr ($) rest xs