1. Bryan O'Sullivan
  2. text

Source

text / Data / Text / UnsafeChar.hs

Duncan Coutts cf3e8bc 
Duncan Coutts 8503dd9 
Bryan O'Sullivan 4762cdc 






Bryan O'Sullivan 7dfeb13 
Bryan O'Sullivan 4762cdc 



Bryan O'Sullivan 230d853 
Bryan O'Sullivan d50fd7b 




Bryan O'Sullivan 230d853 
Bryan O'Sullivan 309a0a8 
Bryan O'Sullivan d50fd7b 
Duncan Coutts 8503dd9 
Bryan O'Sullivan 406de7b 
Bryan O'Sullivan 230d853 
Bryan O'Sullivan fa76866 
Bryan O'Sullivan 230d853 
Bryan O'Sullivan fa76866 
Bryan O'Sullivan 4762cdc 

Bryan O'Sullivan 230d853 
Duncan Coutts 8503dd9 











Bryan O'Sullivan 230d853 



Bryan O'Sullivan 406de7b 

Bryan O'Sullivan 230d853 

Bryan O'Sullivan 406de7b 


Bryan O'Sullivan 230d853 


Bryan O'Sullivan 406de7b 

Bryan O'Sullivan 230d853 
Bryan O'Sullivan 406de7b 
Bryan O'Sullivan 309a0a8 
Bryan O'Sullivan 406de7b 















Bryan O'Sullivan 309a0a8 
{-# LANGUAGE MagicHash #-}

-- |
-- Module      : Data.Text.UnsafeChar
-- Copyright   : (c) Tom Harper 2008-2009,
--               (c) Bryan O'Sullivan 2009,
--               (c) Duncan Coutts 2009
--
-- License     : BSD-style
-- Maintainer  : bos@serpentine.com, rtomharper@googlemail.com,
--               duncan@haskell.org
-- Stability   : experimental
-- Portability : GHC
--
-- Fast character manipulation functions.
module Data.Text.UnsafeChar
    (
      unsafeChr
    , unsafeChr8
    , unsafeChr32
    , unsafeWrite
    -- , unsafeWriteRev
    ) where

import Control.Exception (assert)
import Control.Monad.ST (ST)
import Data.Bits ((.&.))
import Data.Char (ord)
import Data.Text.UnsafeShift (shiftR)
import GHC.Exts (Char(..), chr#, word2Int#)
import GHC.Word (Word8(..), Word16(..), Word32(..))
import qualified Data.Text.Array as A

unsafeChr :: Word16 -> Char
unsafeChr (W16# w#) = C# (chr# (word2Int# w#))
{-# INLINE unsafeChr #-}

unsafeChr8 :: Word8 -> Char
unsafeChr8 (W8# w#) = C# (chr# (word2Int# w#))
{-# INLINE unsafeChr8 #-}

unsafeChr32 :: Word32 -> Char
unsafeChr32 (W32# w#) = C# (chr# (word2Int# w#))
{-# INLINE unsafeChr32 #-}

unsafeWrite :: A.MArray s Word16 -> Int -> Char -> ST s Int
unsafeWrite marr i c
    | n < 0x10000 = do
        assert (i >= 0) . assert (i < A.length marr) $
          A.unsafeWrite marr i (fromIntegral n)
        return (i+1)
    | otherwise = do
        assert (i >= 0) . assert (i < A.length marr - 1) $
          A.unsafeWrite marr i lo
        A.unsafeWrite marr (i+1) hi
        return (i+2)
    where n = ord c
          m = n - 0x10000
          lo = fromIntegral $ (m `shiftR` 10) + 0xD800
          hi = fromIntegral $ (m .&. 0x3FF) + 0xDC00
{-# INLINE unsafeWrite #-}

{-
unsafeWriteRev :: A.MArray s Word16 -> Int -> Char -> ST s Int
unsafeWriteRev marr i c
    | n < 0x10000 = do
        assert (i >= 0) . assert (i < A.length marr) $
          A.unsafeWrite marr i (fromIntegral n)
        return (i-1)
    | otherwise = do
        assert (i >= 1) . assert (i < A.length marr) $
          A.unsafeWrite marr (i-1) lo
        A.unsafeWrite marr i hi
        return (i-2)
    where n = ord c
          m = n - 0x10000
          lo = fromIntegral $ (m `shiftR` 10) + 0xD800
          hi = fromIntegral $ (m .&. 0x3FF) + 0xDC00
{-# INLINE unsafeWriteRev #-}
-}