vector-circular-0.1.1: circular vectors
Safe HaskellNone
LanguageHaskell2010

Data.Vector.Circular

Synopsis

Types

data CircularVector a Source #

A circular, immutable vector. This type is equivalent to cycle xs for some finite, nonempty xs, but with O(1) access and O(1) rotations. Indexing into this type is always total.

Constructors

CircularVector 

Fields

Instances

Instances details
Functor CircularVector Source #

Since: 0.1

Instance details

Defined in Data.Vector.Circular

Methods

fmap :: (a -> b) -> CircularVector a -> CircularVector b #

(<$) :: a -> CircularVector b -> CircularVector a #

Foldable CircularVector Source #

Since: 0.1

Instance details

Defined in Data.Vector.Circular

Methods

fold :: Monoid m => CircularVector m -> m #

foldMap :: Monoid m => (a -> m) -> CircularVector a -> m #

foldMap' :: Monoid m => (a -> m) -> CircularVector a -> m #

foldr :: (a -> b -> b) -> b -> CircularVector a -> b #

foldr' :: (a -> b -> b) -> b -> CircularVector a -> b #

foldl :: (b -> a -> b) -> b -> CircularVector a -> b #

foldl' :: (b -> a -> b) -> b -> CircularVector a -> b #

foldr1 :: (a -> a -> a) -> CircularVector a -> a #

foldl1 :: (a -> a -> a) -> CircularVector a -> a #

toList :: CircularVector a -> [a] #

null :: CircularVector a -> Bool #

length :: CircularVector a -> Int #

elem :: Eq a => a -> CircularVector a -> Bool #

maximum :: Ord a => CircularVector a -> a #

minimum :: Ord a => CircularVector a -> a #

sum :: Num a => CircularVector a -> a #

product :: Num a => CircularVector a -> a #

Traversable CircularVector Source #

Since: 0.1.1

Instance details

Defined in Data.Vector.Circular

Methods

traverse :: Applicative f => (a -> f b) -> CircularVector a -> f (CircularVector b) #

sequenceA :: Applicative f => CircularVector (f a) -> f (CircularVector a) #

mapM :: Monad m => (a -> m b) -> CircularVector a -> m (CircularVector b) #

sequence :: Monad m => CircularVector (m a) -> m (CircularVector a) #

Foldable1 CircularVector Source #

Since: 0.1

Instance details

Defined in Data.Vector.Circular

Methods

fold1 :: Semigroup m => CircularVector m -> m #

foldMap1 :: Semigroup m => (a -> m) -> CircularVector a -> m #

toNonEmpty :: CircularVector a -> NonEmpty a #

Lift a => Lift (CircularVector a :: Type) Source #

Since: 0.1

Instance details

Defined in Data.Vector.Circular

Eq a => Eq (CircularVector a) Source #

Since: 0.1

Instance details

Defined in Data.Vector.Circular

Ord a => Ord (CircularVector a) Source #

Since: 0.1

Instance details

Defined in Data.Vector.Circular

Read a => Read (CircularVector a) Source #

Since: 0.1

Instance details

Defined in Data.Vector.Circular

Show a => Show (CircularVector a) Source #

Since: 0.1

Instance details

Defined in Data.Vector.Circular

Generic (CircularVector a) Source #

Since: 0.1.1

Instance details

Defined in Data.Vector.Circular

Associated Types

type Rep (CircularVector a) :: Type -> Type #

Semigroup (CircularVector a) Source #

The Semigroup (<>) operation behaves by un-rolling the two vectors so that their rotation is 0, concatenating them, returning a new vector with a 0-rotation.

Since: 0.1

Instance details

Defined in Data.Vector.Circular

NFData a => NFData (CircularVector a) Source #

Since: 0.1.1

Instance details

Defined in Data.Vector.Circular

Methods

rnf :: CircularVector a -> () #

type Rep (CircularVector a) Source # 
Instance details

Defined in Data.Vector.Circular

type Rep (CircularVector a) = D1 ('MetaData "CircularVector" "Data.Vector.Circular" "vector-circular-0.1.1-Bs9wagmYXMs2gLuFPSqrfQ" 'False) (C1 ('MetaCons "CircularVector" 'PrefixI 'True) (S1 ('MetaSel ('Just "vector") 'SourceUnpack 'SourceStrict 'DecidedStrict) (Rec0 (NonEmptyVector a)) :*: S1 ('MetaSel ('Just "rotation") 'SourceUnpack 'SourceStrict 'DecidedStrict) (Rec0 Int)))

Construction

singleton :: a -> CircularVector a Source #

Construct a singleton 'CircularVector.

Since: 0.1

toVector :: CircularVector a -> Vector a Source #

Construct a Vector from a CircularVector.

Since: 0.1

unsafeFromVector :: Vector a -> CircularVector a Source #

Construct a CircularVector from a Vector.

Calls error if the input vector is empty.

Since: 0.1

fromList :: [a] -> Maybe (CircularVector a) Source #

Construct a CircularVector from a list.

Since: 0.1

fromListN :: Int -> [a] -> Maybe (CircularVector a) Source #

Construct a CircularVector from a list with a size hint.

Since: 0.1

unsafeFromList :: [a] -> CircularVector a Source #

Construct a CircularVector from a list.

Calls error if the input list is empty.

Since: 0.1

unsafeFromListN :: Int -> [a] -> CircularVector a Source #

Construct a CircularVector from a list with a size hint.

Calls error if the input list is empty, or if the size hint is <= 0.

Since: 0.1

vec :: Lift a => [a] -> Q (TExp (CircularVector a)) Source #

Construct a CircularVector at compile-time using typed Template Haskell.

Since: 0.1

Rotation

rotateLeft :: Int -> CircularVector a -> CircularVector a Source #

Rotate the vector to the left by n number of elements.

Note: Left rotations start to break down due to arithmetic underflow when the size of the input vector is > maxBound Int@

Since: 0.1

rotateRight :: Int -> CircularVector a -> CircularVector a Source #

Rotate the vector to left by n number of elements.

Note: Right rotations start to break down due to arithmetic overflow when the size of the input vector is > maxBound Int@

Since: 0.1

Comparisons

leastRotation :: forall a. Ord a => Vector a -> Int Source #

Since: 0.1

Folds

foldMap :: Monoid m => (a -> m) -> CircularVector a -> m Source #

Lazily-accumulating monoidal fold over a CircularVector. @since 0.1

foldMap' :: Monoid m => (a -> m) -> CircularVector a -> m Source #

Strictly-accumulating monoidal fold over a CircularVector.

Since: 0.1

foldr :: (a -> b -> b) -> b -> CircularVector a -> b Source #

Since: 0.1

foldl :: (b -> a -> b) -> b -> CircularVector a -> b Source #

Since: 0.1

foldr' :: (a -> b -> b) -> b -> CircularVector a -> b Source #

Since: 0.1

foldl' :: (b -> a -> b) -> b -> CircularVector a -> b Source #

Since: 0.1

foldr1 :: (a -> a -> a) -> CircularVector a -> a Source #

Since: 0.1

foldl1 :: (a -> a -> a) -> CircularVector a -> a Source #

Since: 0.1

foldMap1 :: Semigroup m => (a -> m) -> CircularVector a -> m Source #

Lazily-accumulating semigroupoidal fold over a CircularVector.

Since: 0.1

foldMap1' :: Semigroup m => (a -> m) -> CircularVector a -> m Source #

Strictly-accumulating semigroupoidal fold over a CircularVector.

Since: 0.1

Specialized folds

all :: (a -> Bool) -> CircularVector a -> Bool Source #

O(n) Check if all elements satisfy the predicate.

Since: 0.1.1

any :: (a -> Bool) -> CircularVector a -> Bool Source #

O(n) Check if any element satisfies the predicate.

Since: 0.1.1

and :: CircularVector Bool -> Bool Source #

O(n) Check if all elements are True.

Since: 0.1.1

or :: CircularVector Bool -> Bool Source #

O(n) Check if any element is True.

Since: 0.1.1

sum :: Num a => CircularVector a -> a Source #

O(n) Compute the sum of the elements.

Since: 0.1.1

product :: Num a => CircularVector a -> a Source #

O(n) Compute the product of the elements.

Since: 0.1.1

maximum :: Ord a => CircularVector a -> a Source #

O(n) Yield the maximum element of the circular vector.

Since: 0.1.1

maximumBy :: (a -> a -> Ordering) -> CircularVector a -> a Source #

O(n) Yield the maximum element of a circular vector according to the given comparison function.

Since: 0.1.1

minimum :: Ord a => CircularVector a -> a Source #

O(n) Yield the minimum element of the circular vector.

Since: 0.1.1

minimumBy :: (a -> a -> Ordering) -> CircularVector a -> a Source #

O(n) Yield the minimum element of a circular vector according to the given comparison function.

Since: 0.1.1

rotateToMinimumBy :: (a -> a -> Ordering) -> CircularVector a -> CircularVector a Source #

O(n) Rotate to the minimum element of the circular vector according to the given comparison function.

Since: 0.1.1

rotateToMaximumBy :: (a -> a -> Ordering) -> CircularVector a -> CircularVector a Source #

O(n) Rotate to the maximum element of the circular vector according to the given comparison function.

Since: 0.1.1

Indexing

index :: CircularVector a -> Int -> a Source #

Index into a CircularVector. This is always total.

Since: 0.1

head :: CircularVector a -> a Source #

Get the first element of a CircularVector. This is always total.

Since: 0.1

last :: CircularVector a -> a Source #

Get the last element of a CircularVector. This is always total.

Since: 0.1

Zipping

zipWith :: (a -> b -> c) -> CircularVector a -> CircularVector b -> CircularVector c Source #

O(min(m,n)) Zip two circular vectors with the given function.

Since: 0.1.1

zipWith3 :: (a -> b -> c -> d) -> CircularVector a -> CircularVector b -> CircularVector c -> CircularVector d Source #

Zip three circular vectors with the given function.

Since: 0.1.1

zip :: CircularVector a -> CircularVector b -> CircularVector (a, b) Source #

O(min(n,m)) Elementwise pairing of circular vector elements. This is a special case of zipWith where the function argument is (,)

Since: 0.1.1

zip3 :: CircularVector a -> CircularVector b -> CircularVector c -> CircularVector (a, b, c) Source #

Zip together three circular vectors.

Since: 0.1.1

Permutations

reverse :: CircularVector a -> CircularVector a Source #

O(n) Reverse a circular vector.

Since: 0.1.1