{-# language DataKinds #-}
{-# language MagicHash #-}
{-# language UnboxedTuples #-}

module Basics.Char
  ( -- Types
    T
  , T#
  , R
    -- Lifting
  , lift
  , unlift
    -- Array
  , read#
  , write#
  , index#
  , set#
  , shrink#
    -- Constants
  , def
    -- Metadata
  , size
  ) where

import GHC.Exts hiding (setByteArray#)

import qualified Foreign.Storable as FS
import qualified GHC.Exts as Exts

type T = Char
type T# = Char#
type R = 'WordRep

def :: T
def :: T
def = T
'z'

size :: Int
size :: Int
size = forall a. Storable a => a -> Int
FS.sizeOf (forall a. HasCallStack => a
undefined :: T)

lift :: T# -> T
lift :: T# -> T
lift = T# -> T
C#

unlift :: T -> T#
unlift :: T -> T#
unlift (C# T#
i) = T#
i

index# :: ByteArray# -> Int# -> T#
index# :: ByteArray# -> Int# -> T#
index# = ByteArray# -> Int# -> T#
indexWideCharArray#

read# :: MutableByteArray# s -> Int# -> State# s -> (# State# s, T# #)
read# :: forall s.
MutableByteArray# s -> Int# -> State# s -> (# State# s, T# #)
read# = forall s.
MutableByteArray# s -> Int# -> State# s -> (# State# s, T# #)
readWideCharArray#

write# :: MutableByteArray# s -> Int# -> T# -> State# s -> State# s
write# :: forall s. MutableByteArray# s -> Int# -> T# -> State# s -> State# s
write# = forall s. MutableByteArray# s -> Int# -> T# -> State# s -> State# s
writeWideCharArray#

set# :: MutableByteArray# s -> Int# -> Int# -> T# -> State# s -> State# s
set# :: forall s.
MutableByteArray# s -> Int# -> Int# -> T# -> State# s -> State# s
set# MutableByteArray# s
marr Int#
off Int#
len T#
x State# s
s = case Int#
len of
  Int#
0# -> State# s
s
  Int#
_ -> forall s.
MutableByteArray# s -> Int# -> Int# -> T# -> State# s -> State# s
set# MutableByteArray# s
marr (Int#
off Int# -> Int# -> Int#
+# Int#
1# ) (Int#
len Int# -> Int# -> Int#
-# Int#
1# ) T#
x (forall s. MutableByteArray# s -> Int# -> T# -> State# s -> State# s
write# MutableByteArray# s
marr Int#
off T#
x State# s
s)

shrink# :: MutableByteArray# s -> Int# -> State# s -> (# State# s, MutableByteArray# s #)
shrink# :: forall s.
MutableByteArray# s
-> Int# -> State# s -> (# State# s, MutableByteArray# s #)
shrink# MutableByteArray# s
m Int#
i State# s
s0 = (# forall d. MutableByteArray# d -> Int# -> State# d -> State# d
Exts.shrinkMutableByteArray# MutableByteArray# s
m (Int#
i Int# -> Int# -> Int#
*# Int#
4#) State# s
s0, MutableByteArray# s
m #)