content: {-# LANGUAGE MagicHash, BangPatterns #-}
  
  -- |
  -- Module      : Data.Text.Encoding.Utf16
  -- Copyright   : (c) 2008, 2009 Tom Harper,
  --               (c) 2009 Bryan O'Sullivan,
  --               (c) 2009 Duncan Coutts
  --
  -- License     : BSD-style
  -- Maintainer  : bos@serpentine.com, rtomharper@googlemail.com,
  --               duncan@haskell.org
  -- Stability   : experimental
  -- Portability : GHC
  --
  -- Basic UTF-16 validation and character manipulation.
  module Data.Text.Encoding.Utf16
      (
        chr2
      , validate1
      , validate2
      ) where
  
  import GHC.Exts
  import GHC.Word (Word16(..))
  
  chr2 :: Word16 -> Word16 -> Char
  chr2 (W16# a#) (W16# b#) = C# (chr# (upper# +# lower# +# 0x10000#))
      where
        !x# = word2Int# a#
        !y# = word2Int# b#
        !upper# = uncheckedIShiftL# (x# -# 0xD800#) 10#
        !lower# = y# -# 0xDC00#
  {-# INLINE chr2 #-}
  
  validate1    :: Word16 -> Bool
  validate1 x1 = x1 < 0xD800 || x1 > 0xDFFF
  {-# INLINE validate1 #-}
  
  validate2       ::  Word16 -> Word16 -> Bool
  validate2 x1 x2 = x1 >= 0xD800 && x1 <= 0xDBFF &&
                    x2 >= 0xDC00 && x2 <= 0xDFFF
  {-# INLINE validate2 #-}
  