packages feed

MicroHs-0.15.0.0: lib/Mhs/MutUArr.hs

module Mhs.MutUArr(
  MutSTUArr(..),
  newMutSTUArr,
  newMutSTUArrB,
  unsafeReadMutSTUArr,
  unsafeWriteMutSTUArr,
  MutIOUArr(..),
  newMutIOUArr,
  newMutIOUArrB,
  unsafeReadMutIOUArr,
  unsafeWriteMutIOUArr,
  sameByteString,
  withMutIOUArr,
  ) where
import qualified Prelude(); import MiniPrelude
import Control.Monad.ST
import Control.Monad.ST_Type
import Data.ByteString.Internal
import Data.Word.Word8(Word8)
import Foreign.ForeignPtr
import Foreign.Ptr
import Foreign.Storable

newtype MutSTUArr s a = MutSTUArr (MutIOUArr a)

newMutSTUArrB :: forall s a . (Storable a) => Word8 -> Int -> ST s (MutSTUArr s a)
newMutSTUArrB b n = ST $ MutSTUArr <$> newMutIOUArrB b n

newMutSTUArr :: forall s a . (Storable a) => Int -> ST s (MutSTUArr s a)
newMutSTUArr n = ST $ MutSTUArr <$> newMutIOUArr n

unsafeReadMutSTUArr :: (Storable a) => MutSTUArr s a -> Int -> ST s a
unsafeReadMutSTUArr (MutSTUArr bs) i = ST $ unsafeReadMutIOUArr bs i

unsafeWriteMutSTUArr :: (Storable a) => MutSTUArr s a -> Int -> a -> ST s ()
unsafeWriteMutSTUArr (MutSTUArr bs) i a = ST $ unsafeWriteMutIOUArr bs i a

newtype MutIOUArr a = MutIOUArr ByteString

newMutIOUArrB :: forall a . (Storable a) => Word8 -> Int -> IO (MutIOUArr a)
newMutIOUArrB b n = return (MutIOUArr (primBSreplicate (n * sizeOf (undefined :: a)) b))

newMutIOUArr :: forall a . (Storable a) => Int -> IO (MutIOUArr a)
newMutIOUArr = newMutIOUArrB 0

unsafeReadMutIOUArr :: (Storable a) => MutIOUArr a -> Int -> IO a
unsafeReadMutIOUArr arr i = withMutIOUArr arr $ \ p -> peekElemOff p i

unsafeWriteMutIOUArr :: (Storable a) => MutIOUArr a -> Int -> a -> IO ()
unsafeWriteMutIOUArr arr i a = withMutIOUArr arr $ \ p -> pokeElemOff p i a

withMutIOUArr :: MutIOUArr a -> (Ptr a -> IO b) -> IO b
withMutIOUArr (MutIOUArr bs) act = withForeignPtr (primBS2FPtr bs) (act . castPtr)