Portability | non-portable (uses Data.Array.IArray) |
---|---|
Stability | experimental |
Maintainer | [email protected] |
Data.Array.Diff
Description
Functional arrays with constant-time update.
- data IOToDiffArray a i e
- type DiffArray = IOToDiffArray IOArray
- type DiffUArray = IOToDiffArray IOUArray
- module Data.Array.IArray
- newDiffArray :: (MArray a e IO, Ix i) => (i, i) -> [(Int, e)] -> IO (IOToDiffArray a i e)
- readDiffArray :: (MArray a e IO, Ix i) => IOToDiffArray a i e -> Int -> IO e
- replaceDiffArray :: (MArray a e IO, Ix i) => IOToDiffArray a i e -> [(Int, e)] -> IO (IOToDiffArray a i e)
Diff array types
Diff arrays have an immutable interface, but rely on internal
updates in place to provide fast functional update operator
//
.
When the //
operator is applied to a diff array, its contents
are physically updated in place. The old array silently changes
its representation without changing the visible behavior:
it stores a link to the new current array along with the
difference to be applied to get the old contents.
So if a diff array is used in a single-threaded style,
i.e. after //
application the old version is no longer used,
a
takes O(1) time and !
ia
takes O(//
dlength d
).
Accessing elements of older versions gradually becomes slower.
Updating an array which is not current makes a physical copy.
The resulting array is unlinked from the old family. So you
can obtain a version which is guaranteed to be current and
thus have fast element access by a
.
//
[]
data IOToDiffArray a i e Source
Instances
Type synonyms for the two most important IO array types.
type DiffArray = IOToDiffArray IOArraySource
Fully polymorphic lazy boxed diff array.
type DiffUArray = IOToDiffArray IOUArraySource
Strict unboxed diff array, working only for elements
of primitive types but more compact and usually faster than DiffArray
.
Overloaded immutable array interface
Module Data.Array.IArray provides the interface of diff arrays.
They are instances of class IArray
.
module Data.Array.IArray
Low-level interface
These are really internal functions, but you will need them
to make further IArray
instances of various diff array types
(for either more MArray
types or more unboxed element types).
newDiffArray :: (MArray a e IO, Ix i) => (i, i) -> [(Int, e)] -> IO (IOToDiffArray a i e)Source
readDiffArray :: (MArray a e IO, Ix i) => IOToDiffArray a i e -> Int -> IO eSource
replaceDiffArray :: (MArray a e IO, Ix i) => IOToDiffArray a i e -> [(Int, e)] -> IO (IOToDiffArray a i e)Source