Data.Vector.Unboxed.Mutable

vector-0.11.0.0: Efficient Arrays

Copyright | (c) Roman Leshchinskiy 2009-2010
License | BSD-style
Maintainer | Roman Leshchinskiy <rl@cse.unsw.edu.au>
Stability | experimental
Portability | non-portable
Safe Haskell | None
Language | Haskell2010

Data.Vector.Unboxed.Mutable

Contents

- Mutable vectors of primitive types
- Accessors
  - Length information
  - Extracting subvectors
  - Overlapping
- Construction
  - Initialisation
  - Growing
  - Restricting memory usage
- Zipping and unzipping
- Accessing individual elements
- Modifying vectors
  - Filling and copying

Description

Mutable adaptive unboxed vectors

Synopsis

- data family MVector s a
- type IOVector = MVector RealWorld
- type STVector s = MVector s
- class (Vector Vector a, MVector MVector a) => Unbox a
- length :: Unbox a => MVector s a -> Int
- null :: Unbox a => MVector s a -> Bool
- slice :: Unbox a => Int -> Int -> MVector s a -> MVector s a
- init :: Unbox a => MVector s a -> MVector s a
- tail :: Unbox a => MVector s a -> MVector s a
- take :: Unbox a => Int -> MVector s a -> MVector s a
- drop :: Unbox a => Int -> MVector s a -> MVector s a
- splitAt :: Unbox a => Int -> MVector s a -> (MVector s a, MVector s a)
- unsafeSlice :: Unbox a => Int -> Int -> MVector s a -> MVector s a
- unsafeInit :: Unbox a => MVector s a -> MVector s a
- unsafeTail :: Unbox a => MVector s a -> MVector s a
- unsafeTake :: Unbox a => Int -> MVector s a -> MVector s a
- unsafeDrop :: Unbox a => Int -> MVector s a -> MVector s a
- overlaps :: Unbox a => MVector s a -> MVector s a -> Bool
- new :: (PrimMonad m, Unbox a) => Int -> m (MVector (PrimState m) a)
- unsafeNew :: (PrimMonad m, Unbox a) => Int -> m (MVector (PrimState m) a)
- replicate :: (PrimMonad m, Unbox a) => Int -> a -> m (MVector (PrimState m) a)
- replicateM :: (PrimMonad m, Unbox a) => Int -> m a -> m (MVector (PrimState m) a)
- clone :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> m (MVector (PrimState m) a)
- grow :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> Int -> m (MVector (PrimState m) a)
- unsafeGrow :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> Int -> m (MVector (PrimState m) a)
- clear :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> m ()
- zip :: (Unbox a, Unbox b) => MVector s a -> MVector s b -> MVector s (a, b)
- zip3 :: (Unbox a, Unbox b, Unbox c) => MVector s a -> MVector s b -> MVector s c -> MVector s (a, b, c)
- zip4 :: (Unbox a, Unbox b, Unbox c, Unbox d) => MVector s a -> MVector s b -> MVector s c -> MVector s d -> MVector s (a, b, c, d)
- zip5 :: (Unbox a, Unbox b, Unbox c, Unbox d, Unbox e) => MVector s a -> MVector s b -> MVector s c -> MVector s d -> MVector s e -> MVector s (a, b, c, d, e)
- zip6 :: (Unbox a, Unbox b, Unbox c, Unbox d, Unbox e, Unbox f) => MVector s a -> MVector s b -> MVector s c -> MVector s d -> MVector s e -> MVector s f -> MVector s (a, b, c, d, e, f)
- unzip :: (Unbox a, Unbox b) => MVector s (a, b) -> (MVector s a, MVector s b)
- unzip3 :: (Unbox a, Unbox b, Unbox c) => MVector s (a, b, c) -> (MVector s a, MVector s b, MVector s c)
- unzip4 :: (Unbox a, Unbox b, Unbox c, Unbox d) => MVector s (a, b, c, d) -> (MVector s a, MVector s b, MVector s c, MVector s d)
- unzip5 :: (Unbox a, Unbox b, Unbox c, Unbox d, Unbox e) => MVector s (a, b, c, d, e) -> (MVector s a, MVector s b, MVector s c, MVector s d, MVector s e)
- unzip6 :: (Unbox a, Unbox b, Unbox c, Unbox d, Unbox e, Unbox f) => MVector s (a, b, c, d, e, f) -> (MVector s a, MVector s b, MVector s c, MVector s d, MVector s e, MVector s f)
- read :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> Int -> m a
- write :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> Int -> a -> m ()
- modify :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> (a -> a) -> Int -> m ()
- swap :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> Int -> Int -> m ()
- unsafeRead :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> Int -> m a
- unsafeWrite :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> Int -> a -> m ()
- unsafeModify :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> (a -> a) -> Int -> m ()
- unsafeSwap :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> Int -> Int -> m ()
- set :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> a -> m ()
- copy :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> MVector (PrimState m) a -> m ()
- move :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> MVector (PrimState m) a -> m ()
- unsafeCopy :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> MVector (PrimState m) a -> m ()
- unsafeMove :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> MVector (PrimState m) a -> m ()

# Mutable vectors of primitive types

data family MVector s a

Instances

MVector MVector Bool |
MVector MVector Char |
MVector MVector Double |
MVector MVector Float |
MVector MVector Int |
MVector MVector Int8 |
MVector MVector Int16 |
MVector MVector Int32 |
MVector MVector Int64 |
MVector MVector Word |
MVector MVector Word8 |
MVector MVector Word16 |
MVector MVector Word32 |
MVector MVector Word64 |
MVector MVector () |
(RealFloat a, Unbox a) => MVector MVector (Complex a) |
(Unbox a, Unbox b) => MVector MVector (a, b) |
(Unbox a, Unbox b, Unbox c) => MVector MVector (a, b, c) |
(Unbox a, Unbox b, Unbox c, Unbox d) => MVector MVector (a, b, c, d) |
(Unbox a, Unbox b, Unbox c, Unbox d, Unbox e) => MVector MVector (a, b, c, d, e) |
(Unbox a, Unbox b, Unbox c, Unbox d, Unbox e, Unbox f) => MVector MVector (a, b, c, d, e, f) |
NFData (MVector s a) |
data MVector s Bool = MV_Bool (MVector s Word8) |
data MVector s Char = MV_Char (MVector s Char) |
data MVector s Double = MV_Double (MVector s Double) |
data MVector s Float = MV_Float (MVector s Float) |
data MVector s Word64 = MV_Word64 (MVector s Word64) |
data MVector s Word32 = MV_Word32 (MVector s Word32) |
data MVector s Word16 = MV_Word16 (MVector s Word16) |
data MVector s Word8 = MV_Word8 (MVector s Word8) |
data MVector s Word = MV_Word (MVector s Word) |
data MVector s Int64 = MV_Int64 (MVector s Int64) |
data MVector s Int32 = MV_Int32 (MVector s Int32) |
data MVector s Int16 = MV_Int16 (MVector s Int16) |
data MVector s Int8 = MV_Int8 (MVector s Int8) |
data MVector s Int = MV_Int (MVector s Int) |
data MVector s () = MV_Unit Int |
data MVector s (Complex a) = MV_Complex (MVector s (a, a)) |
data MVector s (a, b) = MV_2 !Int !(MVector s a) !(MVector s b) |
data MVector s (a, b, c) = MV_3 !Int !(MVector s a) !(MVector s b) !(MVector s c) |
data MVector s (a, b, c, d) = MV_4 !Int !(MVector s a) !(MVector s b) !(MVector s c) !(MVector s d) |
data MVector s (a, b, c, d, e) = MV_5 !Int !(MVector s a) !(MVector s b) !(MVector s c) !(MVector s d) !(MVector s e) |
data MVector s (a, b, c, d, e, f) = MV_6 !Int !(MVector s a) !(MVector s b) !(MVector s c) !(MVector s d) !(MVector s e) !(MVector s f) |

type IOVector = MVector RealWorld

type STVector s = MVector s

class (Vector Vector a, MVector MVector a) => Unbox a

Instances

Unbox Bool |
Unbox Char |
Unbox Double |
Unbox Float |
Unbox Int |
Unbox Int8 |
Unbox Int16 |
Unbox Int32 |
Unbox Int64 |
Unbox Word |
Unbox Word8 |
Unbox Word16 |
Unbox Word32 |
Unbox Word64 |
Unbox () |
(RealFloat a, Unbox a) => Unbox (Complex a) |
(Unbox a, Unbox b) => Unbox (a, b) |
(Unbox a, Unbox b, Unbox c) => Unbox (a, b, c) |
(Unbox a, Unbox b, Unbox c, Unbox d) => Unbox (a, b, c, d) |
(Unbox a, Unbox b, Unbox c, Unbox d, Unbox e) => Unbox (a, b, c, d, e) |
(Unbox a, Unbox b, Unbox c, Unbox d, Unbox e, Unbox f) => Unbox (a, b, c, d, e, f) |

# Accessors

## Length information

length :: Unbox a => MVector s a -> Int

Length of the mutable vector.

null :: Unbox a => MVector s a -> Bool

Check whether the vector is empty

## Extracting subvectors

slice :: Unbox a => Int -> Int -> MVector s a -> MVector s a

Yield a part of the mutable vector without copying it.

init :: Unbox a => MVector s a -> MVector s a

tail :: Unbox a => MVector s a -> MVector s a

take :: Unbox a => Int -> MVector s a -> MVector s a

drop :: Unbox a => Int -> MVector s a -> MVector s a

splitAt :: Unbox a => Int -> MVector s a -> (MVector s a, MVector s a)

unsafeSlice

Arguments

:: Unbox a |
=> Int | starting index
-> Int | length of the slice
-> MVector s a |
-> MVector s a |

Yield a part of the mutable vector without copying it. No bounds checks are performed.

unsafeInit :: Unbox a => MVector s a -> MVector s a

unsafeTail :: Unbox a => MVector s a -> MVector s a

unsafeTake :: Unbox a => Int -> MVector s a -> MVector s a

unsafeDrop :: Unbox a => Int -> MVector s a -> MVector s a

## Overlapping

overlaps :: Unbox a => MVector s a -> MVector s a -> Bool

Check whether two vectors overlap.

# Construction

## Initialisation

new :: (PrimMonad m, Unbox a) => Int -> m (MVector (PrimState m) a)

Create a mutable vector of the given length.

unsafeNew :: (PrimMonad m, Unbox a) => Int -> m (MVector (PrimState m) a)

Create a mutable vector of the given length. The length is not checked.

replicate :: (PrimMonad m, Unbox a) => Int -> a -> m (MVector (PrimState m) a)

Create a mutable vector of the given length (0 if the length is negative) and fill it with an initial value.

replicateM :: (PrimMonad m, Unbox a) => Int -> m a -> m (MVector (PrimState m) a)

Create a mutable vector of the given length (0 if the length is negative) and fill it with values produced by repeatedly executing the monadic action.

clone :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> m (MVector (PrimState m) a)

Create a copy of a mutable vector.

## Growing

grow :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> Int -> m (MVector (PrimState m) a)

Grow a vector by the given number of elements. The number must be positive.

unsafeGrow :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> Int -> m (MVector (PrimState m) a)

Grow a vector by the given number of elements. The number must be positive but this is not checked.

## Restricting memory usage

clear :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> m ()

Reset all elements of the vector to some undefined value, clearing all references to external objects. This is usually a noop for unboxed vectors.

# Zipping and unzipping

zip :: (Unbox a, Unbox b) => MVector s a -> MVector s b -> MVector s (a, b)

O(1) Zip 2 vectors

zip3 :: (Unbox a, Unbox b, Unbox c) => MVector s a -> MVector s b -> MVector s c -> MVector s (a, b, c)

O(1) Zip 3 vectors

zip4 :: (Unbox a, Unbox b, Unbox c, Unbox d) => MVector s a -> MVector s b -> MVector s c -> MVector s d -> MVector s (a, b, c, d)

O(1) Zip 4 vectors

zip5 :: (Unbox a, Unbox b, Unbox c, Unbox d, Unbox e) => MVector s a -> MVector s b -> MVector s c -> MVector s d -> MVector s e -> MVector s (a, b, c, d, e)

O(1) Zip 5 vectors

zip6 :: (Unbox a, Unbox b, Unbox c, Unbox d, Unbox e, Unbox f) => MVector s a -> MVector s b -> MVector s c -> MVector s d -> MVector s e -> MVector s f -> MVector s (a, b, c, d, e, f)

O(1) Zip 6 vectors

unzip :: (Unbox a, Unbox b) => MVector s (a, b) -> (MVector s a, MVector s b)

O(1) Unzip 2 vectors

unzip3 :: (Unbox a, Unbox b, Unbox c) => MVector s (a, b, c) -> (MVector s a, MVector s b, MVector s c)

O(1) Unzip 3 vectors

unzip4 :: (Unbox a, Unbox b, Unbox c, Unbox d) => MVector s (a, b, c, d) -> (MVector s a, MVector s b, MVector s c, MVector s d)

O(1) Unzip 4 vectors

unzip5 :: (Unbox a, Unbox b, Unbox c, Unbox d, Unbox e) => MVector s (a, b, c, d, e) -> (MVector s a, MVector s b, MVector s c, MVector s d, MVector s e)

O(1) Unzip 5 vectors

unzip6 :: (Unbox a, Unbox b, Unbox c, Unbox d, Unbox e, Unbox f) => MVector s (a, b, c, d, e, f) -> (MVector s a, MVector s b, MVector s c, MVector s d, MVector s e, MVector s f)

O(1) Unzip 6 vectors

# Accessing individual elements

read :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> Int -> m a

Yield the element at the given position.

write :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> Int -> a -> m ()

Replace the element at the given position.

modify :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> (a -> a) -> Int -> m ()

Modify the element at the given position.

swap :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> Int -> Int -> m ()

Swap the elements at the given positions.

unsafeRead :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> Int -> m a

Yield the element at the given position. No bounds checks are performed.

unsafeWrite :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> Int -> a -> m ()

Replace the element at the given position. No bounds checks are performed.

unsafeModify :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> (a -> a) -> Int -> m ()

Modify the element at the given position. No bounds checks are performed.

unsafeSwap :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> Int -> Int -> m ()

Swap the elements at the given positions. No bounds checks are performed.

# Modifying vectors

## Filling and copying

set :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> a -> m ()

Set all elements of the vector to the given value.

copy :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> MVector (PrimState m) a -> m ()

Copy a vector. The two vectors must have the same length and may not overlap.

move :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> MVector (PrimState m) a -> m ()

Move the contents of a vector. The two vectors must have the same length.

If the vectors do not overlap, then this is equivalent to `copy`. Otherwise, the copying is performed as if the source vector were copied to a temporary vector and then the temporary vector was copied to the target vector.

unsafeCopy

Arguments

:: (PrimMonad m, Unbox a) |
=> MVector (PrimState m) a | target
-> MVector (PrimState m) a | source
-> m () |

Copy a vector. The two vectors must have the same length and may not overlap. This is not checked.

unsafeMove

Arguments

:: (PrimMonad m, Unbox a) |
=> MVector (PrimState m) a | target
-> MVector (PrimState m) a | source
-> m () |

Move the contents of a vector. The two vectors must have the same length, but this is not checked.

If the vectors do not overlap, then this is equivalent to `unsafeCopy`. Otherwise, the copying is performed as if the source vector were copied to a temporary vector and then the temporary vector was copied to the target vector.