vector-rotcev: Vectors with O(1) reverse

[ bsd3, data, data-structures, library ] [ Propose Tags ]

A wrapper for an arbitrary Vector with O(1) reverse. Instead of creating a copy, it just flips a flag, which inverts indexing. Imagine it as a vector with a switch between little-endianness and big-endianness.


[Skip to Readme]

Modules

[Index] [Quick Jump]

Downloads

Note: This package has metadata revisions in the cabal description newer than included in the tarball. To unpack the package including the revisions, use 'cabal get'.

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

  • No Candidates
Versions [RSS] 0.1.0.0, 0.1.0.1, 0.1.0.2
Change log changelog.md
Dependencies base (>=4.9 && <5), vector (<0.13) [details]
License BSD-3-Clause
Copyright 2019-2021 Andrew Lelechenko
Author Andrew Lelechenko
Maintainer Andrew Lelechenko <andrew.lelechenko@gmail.com>
Revised Revision 1 made by Bodigrim at 2023-01-14T18:59:52Z
Category Data, Data Structures
Home page https://github.com/Bodigrim/rotcev
Source repo head: git clone https://github.com/Bodigrim/rotcev
Uploaded by Bodigrim at 2021-09-06T21:51:56Z
Distributions LTSHaskell:0.1.0.2, NixOS:0.1.0.2, Stackage:0.1.0.2
Downloads 969 total (19 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2021-09-06 [all 1 reports]

Readme for vector-rotcev-0.1.0.1

[back to package description]

vector-rotcev Hackage Stackage LTS Stackage Nightly

A wrapper for an arbitrary Vector with O(1) reverse. Instead of creating a copy, it just flips a flag, which inverts indexing. Imagine it as a vector with a switch between little-endianness and big-endianness.

Let us have a vector of data vec :: Vector Int, which is manipulated via Data.Vector.Generic-based API. You can wrap it into Forward vec :: Rotcev Vector Int and leave everything else unchanged, because Rotcev Vector Int still has all Vector instances. Then apply reverse (Forward vec) :: Rotcev Vector Int, which effectively reverses the vector in O(1) time and space. Internally instead of actual reversing, reverse just provides a view (or a lens) with an inverted order of indexing, which affects all Data.Vector.Generic API.

For example,

> vec = Data.Vector.Generic.fromList [0..100] :: Data.Vector.Vector Int
> cev = reverse (Forward vec) :: Rotcev Data.Vector.Vector Int
> cev Data.Vector.Generic.! 10
90

In a mutable setting you can freely manipulate original and reversed vectors simultaneously, using mreverse function:

> Control.Monad.ST.runST $ do
    vec <- Data.Vector.Generic.Mutable.replicate 3 0.0
    let cev = mreverse vec
    Data.Vector.Generic.Mutable.write vec 0 1.0
    Data.Vector.Generic.Mutable.write cev 0 2.0
    unRotcev <$> Data.Vector.Generic.freeze vec
    :: Data.Vector.Vector Double
[1.0,0.0,2.0]

This library works for any flavor of Vector: boxed, unboxed, storable, whatever.