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

LicenseBSD-style
Maintainerhaskell@henning-thielemann.de
Stabilityexperimental
Portabilityportable, requires ffi
Safe HaskellNone
LanguageHaskell98

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 e Source #

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 e Source #

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 e Source #

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.