packages feed

basics-0.2.0.0: src/Basics/Char.hs

{-# 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 = 'z'

size :: Int
size = FS.sizeOf (undefined :: T)

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

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

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

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

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

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

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