content: {-
  Z%
  (c) The University of Glasgow, 2000-2006
  
  \section{Fast functions}
  -}
  
  {-# LANGUAGE CPP, MagicHash, UnboxedTuples #-}
  
  module Eta.Utils.FastFunctions (
      unsafeChr, inlinePerformIO, unsafeDupableInterleaveIO,
      indexWord8OffFastPtr,
      indexWord8OffFastPtrAsFastChar, indexWord8OffFastPtrAsFastInt,
      global, Global
    ) where
  
  #include "HsVersions.h"
  
  import Eta.Utils.FastTypes
  import Data.IORef
  import System.IO.Unsafe
  
  import GHC.Exts
  import GHC.Word
  import GHC.Base (unsafeChr)
  
  import GHC.IO   (IO(..), unsafeDupableInterleaveIO)
  
  -- Just like unsafePerformIO, but we inline it.
  {-# INLINE inlinePerformIO #-}
  inlinePerformIO :: IO a -> a
  inlinePerformIO (IO m) = case m realWorld# of (# _, r #)   -> r
  
  indexWord8OffFastPtr p i = W8# (indexWord8OffAddr# p i)
  indexWord8OffFastPtrAsFastChar p i = indexCharOffAddr# p i
  indexWord8OffFastPtrAsFastInt p i = word2Int# (indexWord8OffAddr# p i)
  -- or ord# (indexCharOffAddr# p i)
  
  --just so we can refer to the type clearly in a macro
  type Global a = IORef a
  global :: a -> Global a
  global a = unsafePerformIO (newIORef a)
  
  indexWord8OffFastPtr :: FastPtr Word8 -> FastInt -> Word8
  indexWord8OffFastPtrAsFastChar :: FastPtr Word8 -> FastInt -> FastChar
  indexWord8OffFastPtrAsFastInt :: FastPtr Word8 -> FastInt -> FastInt
  