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

module Basics.Word
  ( -- Types
    T
  , T#
  , R
    -- Lifting
  , lift
  , unlift
    -- Arithmetic
  , plus
  , minus
  , plus#
  , minus#
  , times#
  , quot#
  , rem#
    -- Compare
  , gt#
  , lt#
  , gte#
  , lte#
  , eq#
  , neq#
    -- Array
  , readByteArray#
  , writeByteArray#
  , indexByteArray#
  , shrink#
    -- Metadata
  , signed
  , size
  ) where

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

type T = Word
type T# = Word#
type R = 'WordRep

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

signed :: Bool
signed :: Bool
signed = Bool
False

lift :: T# -> T
lift :: T# -> Word
lift = T# -> Word
W#

unlift :: T -> T#
unlift :: Word -> T#
unlift (W# T#
i) = T#
i

plus :: T -> T -> T
plus :: Word -> Word -> Word
plus (W# T#
x) (W# T#
y) = T# -> Word
W# (T# -> T# -> T#
plusWord# T#
x T#
y)

minus :: T -> T -> T
minus :: Word -> Word -> Word
minus (W# T#
x) (W# T#
y) = T# -> Word
W# (T# -> T# -> T#
minusWord# T#
x T#
y)

times# :: T# -> T# -> T#
times# :: T# -> T# -> T#
times# = T# -> T# -> T#
timesWord#

quot# :: T# -> T# -> T#
quot# :: T# -> T# -> T#
quot# = T# -> T# -> T#
quotWord#

rem# :: T# -> T# -> T#
rem# :: T# -> T# -> T#
rem# = T# -> T# -> T#
remWord#

plus# :: T# -> T# -> T#
plus# :: T# -> T# -> T#
plus# = T# -> T# -> T#
plusWord#

minus# :: T# -> T# -> T#
minus# :: T# -> T# -> T#
minus# = T# -> T# -> T#
minusWord#

gt# :: T# -> T# -> Int#
gt# :: T# -> T# -> Int#
gt# = T# -> T# -> Int#
gtWord#

lt# :: T# -> T# -> Int#
lt# :: T# -> T# -> Int#
lt# = T# -> T# -> Int#
ltWord#

gte# :: T# -> T# -> Int#
gte# :: T# -> T# -> Int#
gte# = T# -> T# -> Int#
geWord#

lte# :: T# -> T# -> Int#
lte# :: T# -> T# -> Int#
lte# = T# -> T# -> Int#
leWord#

eq# :: T# -> T# -> Int#
eq# :: T# -> T# -> Int#
eq# = T# -> T# -> Int#
eqWord#

neq# :: T# -> T# -> Int#
neq# :: T# -> T# -> Int#
neq# = T# -> T# -> Int#
neWord#

indexByteArray# :: ByteArray# -> Int# -> T#
indexByteArray# :: ByteArray# -> Int# -> T#
indexByteArray# = ByteArray# -> Int# -> T#
indexWordArray#

readByteArray# :: MutableByteArray# s -> Int# -> State# s -> (# State# s, T# #)
readByteArray# :: forall s.
MutableByteArray# s -> Int# -> State# s -> (# State# s, T# #)
readByteArray# = forall s.
MutableByteArray# s -> Int# -> State# s -> (# State# s, T# #)
readWordArray#

writeByteArray# :: MutableByteArray# s -> Int# -> T# -> State# s -> State# s
writeByteArray# :: forall s. MutableByteArray# s -> Int# -> T# -> State# s -> State# s
writeByteArray# = forall s. MutableByteArray# s -> Int# -> T# -> State# s -> State# s
writeWordArray#

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#
*# (case Int
size of I# Int#
sz -> Int#
sz)) State# s
s0, MutableByteArray# s
m #)