storablevector-0.2.8.1: Fast, packed, strict storable arrays with a list interface like ByteString

Portabilityportable, requires ffi
Stabilityexperimental
Maintainerhaskell@henning-thielemann.de
Safe HaskellSafe-Infered

Data.StorableVector.ST.Lazy

Description

Tested with : GHC 6.4.1

Interface for access to a mutable StorableVector.

Synopsis

Documentation

data Vector s a Source

new :: Storable e => Int -> e -> ST s (Vector s e)Source

new_ :: Storable e => Int -> ST s (Vector s e)Source

read :: Storable e => Vector s e -> Int -> ST s eSource

 Control.Monad.ST.runST (do arr <- new_ 10; Monad.zipWithM_ (write arr) [9,8..0] ['a'..]; read arr 3)

write :: Storable e => Vector s e -> Int -> e -> ST s ()Source

 VS.unpack $ runSTVector (do arr <- new_ 10; Monad.zipWithM_ (write arr) [9,8..0] ['a'..]; return arr)

modify :: Storable e => Vector s e -> Int -> (e -> e) -> ST s ()Source

unsafeRead :: Storable e => Vector s e -> Int -> ST s eSource

unsafeWrite :: Storable e => Vector s e -> Int -> e -> ST s ()Source

unsafeModify :: Storable e => Vector s e -> Int -> (e -> e) -> ST s ()Source

freeze :: Storable e => Vector s e -> ST s (Vector e)Source

thaw :: Storable e => Vector e -> ST s (Vector s e)Source

runSTVector :: Storable e => (forall s. ST s (Vector s e)) -> Vector eSource

mapST :: (Storable a, Storable b) => (a -> ST s b) -> Vector a -> ST s (Vector b)Source

 :module + Data.STRef
 VS.unpack $ Control.Monad.ST.runST (do ref <- newSTRef 'a'; mapST (\ _n -> do c <- readSTRef ref; modifySTRef ref succ; return c) (VS.pack [1,2,3,4::Data.Int.Int16]))

mapSTLazy :: (Storable a, Storable b) => (a -> ST s b) -> Vector a -> ST s (Vector b)Source

 *Data.StorableVector.ST.Strict Data.STRef> VL.unpack $ Control.Monad.ST.runST (do ref <- newSTRef 'a'; mapSTLazy (\ _n -> do c <- readSTRef ref; modifySTRef ref succ; return c) (VL.pack VL.defaultChunkSize [1,2,3,4::Data.Int.Int16]))
 "abcd"

The following should not work on infinite streams, since we are in ST with strict >>=. But it works. Why?

 *Data.StorableVector.ST.Strict Data.STRef.Lazy> VL.unpack $ Control.Monad.ST.Lazy.runST (do ref <- newSTRef 'a'; mapSTLazy (\ _n -> do c <- readSTRef ref; modifySTRef ref succ; return c) (VL.pack VL.defaultChunkSize [0::Data.Int.Int16 ..]))
 "Interrupted.