## dense
[![Build Status](https://travis-ci.org/cchalmers/dense.svg?branch=master)](https://travis-ci.org/cchalmers/dense)
[![Haddock](https://rawgit.com/cchalmers/dense/gh-pages/haddock.svg)](https://cchalmers.github.io/dense/)
[![Hackage](https://img.shields.io/hackage/v/dense.svg?style=flat)](https://hackage.haskell.org/package/dense)
[`dense`]: http://hackage.haskell.org/package/dense
[`vector`]: http://hackage.haskell.org/package/vector
[`linear`]: http://hackage.haskell.org/package/linear
[`repa`]: http://hackage.haskell.org/package/repa
[`array`]: http://hackage.haskell.org/package/array
[`yarr`]: http://hackage.haskell.org/package/yarr
[`dense`] is a multidimensional array library build on top of the
[`vector`] package, using indices from the [`linear`] package. Native
support for mutable arrays, stencils and parallel computation.
### Array type
Arrays are just vectors (from [`vector`]) with a shape:
```.haskell
data Array v f a = Array !(f Layout) !(v a)
```
where `Layout f = f Int` is the shape of the array, given by a vector
from [`linear`] (`V1`, `V2`, `V3` or `V4`). These vectors are also used
to indexing:
```.haskell
> a ! V3 1 2 3
```
### Delayed arrays
A delayed array, defined by
```.haskell
data Delayed f a = Delayed !(Layout f) (Int -> a)
```
can be constructing from a normal array via `delay`. It can be useful
for mapping a function over an array and computing the result in
parallel via `manifest`:
```.haskell
> manifest . fmap (+100) . delay
```
or equivalently using the `delayed` isomorphism:
```.haskell
> delayed +~ 100
```
`Delayed` is an instance of many classes, including `Additive` from
[`linear`](http://hackage.haskell.org/package/linear):
```.haskell
> manifest $ delay a ^+^ 3 *^ delay b
```
### Mutable
[`dense`] has similar mutable capabilities to [`vector`], supporting
mutable operations over a `PrimMonad` in `Data.Dense.Mutable`.
### Stencils
[`dense`] has good stencil support, allowing construction of 1D, 2D or 3D
stencils using template haskell and quasiquoters.
```.haskell
myStencil = [stencil|
2/5 8/5 2/5
8/5 2 8/5
2/5 8/5 2/5
|]
```
Stencils made with template haskell are unrolled at compile time.
### Comparison to other array libraries
[`array`] supports multidimensional and mutable arrays but [`dense`]
provides many more high level functions as well as stencils and parallel
computation.
[`repa`] and [`yarr`]
[`dense`] has a lot of the same features as [`repa`] and [`yarr`].
Performance should be similar (more benchmarks needed) but [`dense`] also
has support for mutable arrays and multidimensional stencils.
### Package structure
Like [`vector`], there is a [`Data.Shaped.Generic`] module for working
over any generic vector as well as [`Data.Shaped.Unboxed`] and
[`Data.Shaped.Storable`] modules. Unlike [`vector`], boxed vectors are
in [`Data.Shaped.Boxed`].
The [`Data.Shaped`] module includes a subset of [`Data.Shaped.Generic`]
as well as some extra reexports and is intended to be imported
*unqualified*.
[`Data.Shaped`]: https://cchalmers.github.io/dense/Data-Shaped.html
[`Data.Shaped.Boxed`]: https://cchalmers.github.io/dense/Data-Shaped-Boxed.html
[`Data.Shaped.Generic`]: https://cchalmers.github.io/dense/Data-Shaped-Generic.html
[`Data.Shaped.Storable`]: https://cchalmers.github.io/dense/Data-Shaped-Storable.html
[`Data.Shaped.Unboxed`]: https://cchalmers.github.io/dense/Data-Shaped-Unboxed.html