1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
-- |
-- Module : Basement.String.Encoding.UTF32
-- License : BSD-style
-- Maintainer : Foundation
-- Stability : experimental
-- Portability : portable
--
{-# LANGUAGE MagicHash #-}
module Basement.String.Encoding.UTF32
( UTF32(..)
, UTF32_Invalid
) where
import GHC.Prim
import GHC.Word
import GHC.Types
import Basement.Compat.Base
import Basement.Compat.Primitive
import Basement.Types.OffsetSize
import Basement.Monad
import Basement.Numerical.Additive
import Basement.UArray
import Basement.UArray.Mutable (MUArray)
import Basement.MutableBuilder
import Basement.String.Encoding.Encoding
data UTF32 = UTF32
data UTF32_Invalid = UTF32_Invalid
deriving (Typeable, Show, Eq, Ord, Enum, Bounded)
instance Exception UTF32_Invalid
instance Encoding UTF32 where
type Unit UTF32 = Word32
type Error UTF32 = UTF32_Invalid
encodingNext _ = next
encodingWrite _ = write
next :: (Offset Word32 -> Word32)
-> Offset Word32
-> Either UTF32_Invalid (Char, Offset Word32)
next getter off = Right (char, off + Offset 1)
where
!(W32# hh) = getter off
char :: Char
char = C# (word32ToChar# hh)
write :: (PrimMonad st, Monad st)
=> Char
-> Builder (UArray Word32) (MUArray Word32) Word32 st err ()
write c = builderAppend w32
where
!(C# ch) = c
w32 :: Word32
w32 = W32# (charToWord32# ch)
|