packages feed

MicroHs-0.15.0.0: lib/Mhs/UArr.hs

module Mhs.UArr(
  UArr(..),
  newUArr,
  unsafeReadUArr,
  copyUArr,
  unsafeFreezeMutSTUArr,
  unsafeThawSTUArr,
  unsafeFreezeMutIOUArr,
  unsafeThawIOUArr,
  ) where
import qualified Prelude(); import MiniPrelude
import Primitives(primPerformIO)
import Control.Monad.ST
import Control.Monad.ST_Type
import Data.ByteString(copy)
import Data.ByteString.Internal
import Foreign.ForeignPtr
import Foreign.Ptr
import Foreign.Storable
import Mhs.MutUArr

newtype UArr a = UArr ByteString

newUArr :: forall s a . (Storable a) => Int -> [(Int, a)] -> UArr a
newUArr n ies = runST $ do
  a <- newMutSTUArr n
  mapM_ (uncurry (unsafeWriteMutSTUArr a)) ies
  unsafeFreezeMutSTUArr a

unsafeReadUArr :: (Storable a) => UArr a -> Int -> a
unsafeReadUArr (UArr bs) i = primPerformIO $
  withForeignPtr (primBS2FPtr bs) $ \ p ->
    peekElemOff (castPtr p) i

copyUArr :: UArr a -> UArr a
copyUArr (UArr a) = UArr (copy a)

unsafeFreezeMutSTUArr :: MutSTUArr s a -> ST s (UArr a)
unsafeFreezeMutSTUArr (MutSTUArr (MutIOUArr a)) = return (UArr a)

unsafeThawSTUArr :: UArr a -> ST s (MutSTUArr s a)
unsafeThawSTUArr (UArr a) = return (MutSTUArr (MutIOUArr a))

unsafeFreezeMutIOUArr :: MutIOUArr a -> IO (UArr a)
unsafeFreezeMutIOUArr (MutIOUArr a) = return (UArr a)

unsafeThawIOUArr :: UArr a -> IO (MutIOUArr a)
unsafeThawIOUArr (UArr a) = return (MutIOUArr a)