-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Unboxed vectors of bits / dense IntSets -- -- Another bit-array library for Haskell. This one defines a Bit -- type (which is an instance of all the "expected" classes, including -- numeric ones) and makes that type an instance of `Data.Vector.Unboxed. -- Unbox`, so we get a lot of nice APIs for free. Bool is already -- an unboxable type, but the current unboxed Vector -- implementation packs each bit as a byte. This one packs 8 bits per -- byte, as expected (UArray from the array package also -- uses one bit per Bool). -- -- In addition to the Vector interface, there are several -- high-level operations and some low-level ones suitable for building -- new bulk operations by viewing the bit-vector as a word vector. @package bitvec @version 0.1.1.0 module Data.Bit data Bit fromBool :: Bool -> Bit toBool :: Bit -> Bool instance GHC.Show.Show Data.Bit.Internal.Bit instance GHC.Read.Read Data.Bit.Internal.Bit instance GHC.Num.Num Data.Bit.Internal.Bit instance GHC.Real.Real Data.Bit.Internal.Bit instance GHC.Real.Integral Data.Bit.Internal.Bit instance Data.Bits.Bits Data.Bit.Internal.Bit module Data.Vector.Unboxed.Mutable.Bit -- | O(1) Unzip 6 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) Zip 6 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) Unzip 5 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) Zip 5 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) Unzip 4 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) Zip 4 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) Unzip 3 vectors unzip3 :: (Unbox a, Unbox b, Unbox c) => MVector s (a, b, c) -> (MVector s a, MVector s b, MVector s c) -- | O(1) Zip 3 vectors zip3 :: (Unbox a, Unbox b, Unbox c) => MVector s a -> MVector s b -> MVector s c -> MVector s (a, b, c) -- | O(1) Unzip 2 vectors unzip :: (Unbox a, Unbox b) => MVector s (a, b) -> (MVector s a, MVector s b) -- | O(1) Zip 2 vectors zip :: (Unbox a, Unbox b) => MVector s a -> MVector s b -> MVector s (a, b) -- | Compute the next (lexicographically) permutation of given vector -- in-place. Returns False when input is the last permtuation nextPermutation :: (PrimMonad m, Ord e, Unbox e) => MVector (PrimState m) e -> m Bool -- | 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. unsafeMove :: (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. move :: (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. This is not checked. unsafeCopy :: (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. copy :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> MVector (PrimState m) a -> m () -- | Set all elements of the vector to the given value. set :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> a -> m () -- | Swap the elements at the given positions. No bounds checks are -- performed. unsafeSwap :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> Int -> Int -> m () -- | Modify the element at the given position. No bounds checks are -- performed. unsafeModify :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> (a -> a) -> Int -> m () -- | Replace the element at the given position. No bounds checks are -- performed. unsafeWrite :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> Int -> a -> m () -- | Yield the element at the given position. No bounds checks are -- performed. unsafeRead :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> Int -> m a -- | Swap the elements at the given positions. swap :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> Int -> Int -> m () -- | Modify the element at the given position. modify :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> (a -> a) -> Int -> m () -- | Replace the element at the given position. write :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> Int -> a -> m () -- | Yield the element at the given position. read :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> Int -> m a -- | Reset all elements of the vector to some undefined value, clearing all -- references to external objects. This is usually a noop for unboxed -- vectors. clear :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> m () -- | Grow a vector by the given number of elements. The number must be -- positive but this is not checked. 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. grow :: (PrimMonad m, Unbox a) => MVector (PrimState m) a -> Int -> m (MVector (PrimState m) a) -- | Create a copy of a mutable vector. clone :: (PrimMonad m, Unbox a) => MVector (PrimState 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. 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 an initial value. replicate :: (PrimMonad m, Unbox a) => Int -> a -> m (MVector (PrimState m) a) -- | Create a mutable vector of the given length. The memory is not -- initialized. unsafeNew :: (PrimMonad m, Unbox a) => Int -> m (MVector (PrimState m) a) -- | Create a mutable vector of the given length. new :: (PrimMonad m, Unbox a) => Int -> m (MVector (PrimState m) a) -- | Check whether two vectors overlap. overlaps :: Unbox a => MVector s a -> MVector s a -> Bool unsafeTail :: Unbox a => MVector s a -> MVector s a unsafeInit :: Unbox a => MVector s a -> MVector s a unsafeDrop :: Unbox a => Int -> MVector s a -> MVector s a unsafeTake :: Unbox a => Int -> MVector s a -> MVector s a -- | Yield a part of the mutable vector without copying it. No bounds -- checks are performed. unsafeSlice :: Unbox a => Int -> Int -> MVector s a -> MVector s a tail :: Unbox a => MVector s a -> MVector s a init :: Unbox a => MVector s a -> MVector s a splitAt :: Unbox a => Int -> MVector s a -> (MVector s a, MVector s a) drop :: Unbox a => Int -> MVector s a -> MVector s a take :: Unbox a => Int -> MVector s a -> MVector s a -- | Yield a part of the mutable vector without copying it. slice :: Unbox a => Int -> Int -> MVector s a -> MVector s a -- | Check whether the vector is empty null :: Unbox a => MVector s a -> Bool -- | Length of the mutable vector. length :: Unbox a => MVector s a -> Int data family MVector s a :: Type data family Vector a :: Type type IOVector = MVector RealWorld type STVector s = MVector s class (Vector Vector a, MVector MVector a) => Unbox a -- | The number of Bits in a Word. A handy constant to have -- around when defining Word-based bulk operations on bit vectors. wordSize :: Int -- | Get the length of the vector that would be created by -- cloneToWords wordLength :: MVector s Bit -> Int -- | Clone a specified number of bits from a vector of words into a new -- vector of bits (interpreting the words in little-endian order, as -- described at indexWord). If there are not enough words for the -- number of bits requested, the vector will be zero-padded. cloneFromWords :: PrimMonad m => Int -> MVector (PrimState m) Word -> m (MVector (PrimState m) Bit) -- | clone a vector of bits to a new unboxed vector of words. If the bits -- don't completely fill the words, the last word will be zero-padded. cloneToWords :: PrimMonad m => MVector (PrimState m) Bit -> m (MVector (PrimState m) Word) -- | read a word at the given bit offset in little-endian order (i.e., the -- LSB will correspond to the bit at the given address, the 2's bit will -- correspond to the address + 1, etc.). If the offset is such that the -- word extends past the end of the vector, the result is zero-padded. readWord :: PrimMonad m => MVector (PrimState m) Bit -> Int -> m Word -- | write a word at the given bit offset in little-endian order (i.e., the -- LSB will correspond to the bit at the given address, the 2's bit will -- correspond to the address + 1, etc.). If the offset is such that the -- word extends past the end of the vector, the word is truncated and as -- many low-order bits as possible are written. writeWord :: PrimMonad m => MVector (PrimState m) Bit -> Int -> Word -> m () -- | Map a function over a bit vector one Word at a time -- (wordSize bits at a time). The function will be passed the bit -- index (which will always be wordSize-aligned) and the current -- value of the corresponding word. The returned word will be written -- back to the vector. If there is a partial word at the end of the -- vector, it will be zero-padded when passed to the function and -- truncated when the result is written back to the array. mapMInPlaceWithIndex :: PrimMonad m => (Int -> Word -> m Word) -> MVector (PrimState m) Bit -> m () mapInPlaceWithIndex :: PrimMonad m => (Int -> Word -> Word) -> MVector (PrimState m) Bit -> m () -- | Same as mapMInPlaceWithIndex but without the index. mapMInPlace :: PrimMonad m => (Word -> m Word) -> MVector (PrimState m) Bit -> m () mapInPlace :: PrimMonad m => (Word -> Word) -> MVector (PrimState m) Bit -> m () zipInPlace :: PrimMonad m => (Word -> Word -> Word) -> MVector (PrimState m) Bit -> Vector Bit -> m () unionInPlace :: PrimMonad m => MVector (PrimState m) Bit -> Vector Bit -> m () intersectionInPlace :: PrimMonad m => MVector (PrimState m) Bit -> Vector Bit -> m () differenceInPlace :: PrimMonad m => MVector (PrimState m) Bit -> Vector Bit -> m () symDiffInPlace :: PrimMonad m => MVector (PrimState m) Bit -> Vector Bit -> m () -- | Flip every bit in the given vector invertInPlace :: PrimMonad m => MVector (PrimState m) Bit -> m () selectBitsInPlace :: PrimMonad m => Vector Bit -> MVector (PrimState m) Bit -> m Int excludeBitsInPlace :: PrimMonad m => Vector Bit -> MVector (PrimState m) Bit -> m Int -- | return the number of ones in a bit vector countBits :: PrimMonad m => MVector (PrimState m) Bit -> m Int listBits :: PrimMonad m => MVector (PrimState m) Bit -> m [Int] -- | Returns True if all bits in the vector are set and :: PrimMonad m => MVector (PrimState m) Bit -> m Bool -- | Returns True if any bit in the vector is set or :: PrimMonad m => MVector (PrimState m) Bit -> m Bool any :: PrimMonad m => (Bit -> Bool) -> MVector (PrimState m) Bit -> m Bool anyBits :: PrimMonad m => Bit -> MVector (PrimState m) Bit -> m Bool all :: PrimMonad m => (Bit -> Bool) -> MVector (PrimState m) Bit -> m Bool allBits :: PrimMonad m => Bit -> MVector (PrimState m) Bit -> m Bool reverseInPlace :: PrimMonad m => MVector (PrimState m) Bit -> m () module Data.Vector.Unboxed.Bit -- | O(1) Unzip 6 vectors unzip6 :: (Unbox a, Unbox b, Unbox c, Unbox d, Unbox e, Unbox f) => Vector (a, b, c, d, e, f) -> (Vector a, Vector b, Vector c, Vector d, Vector e, Vector f) -- | O(1) Zip 6 vectors zip6 :: (Unbox a, Unbox b, Unbox c, Unbox d, Unbox e, Unbox f) => Vector a -> Vector b -> Vector c -> Vector d -> Vector e -> Vector f -> Vector (a, b, c, d, e, f) -- | O(1) Unzip 5 vectors unzip5 :: (Unbox a, Unbox b, Unbox c, Unbox d, Unbox e) => Vector (a, b, c, d, e) -> (Vector a, Vector b, Vector c, Vector d, Vector e) -- | O(1) Zip 5 vectors zip5 :: (Unbox a, Unbox b, Unbox c, Unbox d, Unbox e) => Vector a -> Vector b -> Vector c -> Vector d -> Vector e -> Vector (a, b, c, d, e) -- | O(1) Unzip 4 vectors unzip4 :: (Unbox a, Unbox b, Unbox c, Unbox d) => Vector (a, b, c, d) -> (Vector a, Vector b, Vector c, Vector d) -- | O(1) Zip 4 vectors zip4 :: (Unbox a, Unbox b, Unbox c, Unbox d) => Vector a -> Vector b -> Vector c -> Vector d -> Vector (a, b, c, d) -- | O(1) Unzip 3 vectors unzip3 :: (Unbox a, Unbox b, Unbox c) => Vector (a, b, c) -> (Vector a, Vector b, Vector c) -- | O(1) Zip 3 vectors zip3 :: (Unbox a, Unbox b, Unbox c) => Vector a -> Vector b -> Vector c -> Vector (a, b, c) -- | O(1) Unzip 2 vectors unzip :: (Unbox a, Unbox b) => Vector (a, b) -> (Vector a, Vector b) -- | O(1) Zip 2 vectors zip :: (Unbox a, Unbox b) => Vector a -> Vector b -> Vector (a, b) -- | O(n) Copy an immutable vector into a mutable one. The two -- vectors must have the same length. copy :: (Unbox a, PrimMonad m) => MVector (PrimState m) a -> Vector a -> m () -- | O(n) Copy an immutable vector into a mutable one. The two -- vectors must have the same length. This is not checked. unsafeCopy :: (Unbox a, PrimMonad m) => MVector (PrimState m) a -> Vector a -> m () -- | O(n) Yield an immutable copy of the mutable vector. freeze :: (Unbox a, PrimMonad m) => MVector (PrimState m) a -> m (Vector a) -- | O(n) Yield a mutable copy of the immutable vector. thaw :: (Unbox a, PrimMonad m) => Vector a -> m (MVector (PrimState m) a) -- | O(1) Unsafely convert an immutable vector to a mutable one -- without copying. The immutable vector may not be used after this -- operation. unsafeThaw :: (Unbox a, PrimMonad m) => Vector a -> m (MVector (PrimState m) a) -- | O(1) Unsafe convert a mutable vector to an immutable one -- without copying. The mutable vector may not be used after this -- operation. unsafeFreeze :: (Unbox a, PrimMonad m) => MVector (PrimState m) a -> m (Vector a) -- | O(n) Convert the first n elements of a list to a -- vector -- --
-- fromListN n xs = fromList (take n xs) --fromListN :: Unbox a => Int -> [a] -> Vector a -- | O(n) Convert a list to a vector fromList :: Unbox a => [a] -> Vector a -- | O(n) Convert a vector to a list toList :: Unbox a => Vector a -> [a] -- | O(n) Right-to-left scan over a non-empty vector with a strict -- accumulator scanr1' :: Unbox a => (a -> a -> a) -> Vector a -> Vector a -- | O(n) Right-to-left scan over a non-empty vector scanr1 :: Unbox a => (a -> a -> a) -> Vector a -> Vector a -- | O(n) Right-to-left Haskell-style scan with strict accumulator scanr' :: (Unbox a, Unbox b) => (a -> b -> b) -> b -> Vector a -> Vector b -- | O(n) Right-to-left Haskell-style scan scanr :: (Unbox a, Unbox b) => (a -> b -> b) -> b -> Vector a -> Vector b -- | O(n) Right-to-left scan with strict accumulator postscanr' :: (Unbox a, Unbox b) => (a -> b -> b) -> b -> Vector a -> Vector b -- | O(n) Right-to-left scan postscanr :: (Unbox a, Unbox b) => (a -> b -> b) -> b -> Vector a -> Vector b -- | O(n) Right-to-left prescan with strict accumulator prescanr' :: (Unbox a, Unbox b) => (a -> b -> b) -> b -> Vector a -> Vector b -- | O(n) Right-to-left prescan -- --
-- prescanr f z = reverse . prescanl (flip f) z . reverse --prescanr :: (Unbox a, Unbox b) => (a -> b -> b) -> b -> Vector a -> Vector b -- | O(n) Scan over a non-empty vector with a strict accumulator scanl1' :: Unbox a => (a -> a -> a) -> Vector a -> Vector a -- | O(n) Scan over a non-empty vector -- --
-- scanl f <x1,...,xn> = <y1,...,yn> -- where y1 = x1 -- yi = f y(i-1) xi --scanl1 :: Unbox a => (a -> a -> a) -> Vector a -> Vector a -- | O(n) Haskell-style scan with strict accumulator scanl' :: (Unbox a, Unbox b) => (a -> b -> a) -> a -> Vector b -> Vector a -- | O(n) Haskell-style scan -- --
-- scanl f z <x1,...,xn> = <y1,...,y(n+1)> -- where y1 = z -- yi = f y(i-1) x(i-1) ---- -- Example: scanl (+) 0 <1,2,3,4> = <0,1,3,6,10> scanl :: (Unbox a, Unbox b) => (a -> b -> a) -> a -> Vector b -> Vector a -- | O(n) Scan with strict accumulator postscanl' :: (Unbox a, Unbox b) => (a -> b -> a) -> a -> Vector b -> Vector a -- | O(n) Scan -- --
-- postscanl f z = tail . scanl f z ---- -- Example: postscanl (+) 0 <1,2,3,4> = <1,3,6,10> postscanl :: (Unbox a, Unbox b) => (a -> b -> a) -> a -> Vector b -> Vector a -- | O(n) Prescan with strict accumulator prescanl' :: (Unbox a, Unbox b) => (a -> b -> a) -> a -> Vector b -> Vector a -- | O(n) Prescan -- --
-- prescanl f z = init . scanl f z ---- -- Example: prescanl (+) 0 <1,2,3,4> = <0,1,3,6> prescanl :: (Unbox a, Unbox b) => (a -> b -> a) -> a -> Vector b -> Vector a -- | O(n) Monadic fold over non-empty vectors with strict -- accumulator that discards the result fold1M'_ :: (Monad m, Unbox a) => (a -> a -> m a) -> Vector a -> m () -- | O(n) Monadic fold with strict accumulator that discards the -- result (action applied to each element and its index) ifoldM'_ :: (Monad m, Unbox b) => (a -> Int -> b -> m a) -> a -> Vector b -> m () -- | O(n) Monadic fold with strict accumulator that discards the -- result foldM'_ :: (Monad m, Unbox b) => (a -> b -> m a) -> a -> Vector b -> m () -- | O(n) Monadic fold over non-empty vectors that discards the -- result fold1M_ :: (Monad m, Unbox a) => (a -> a -> m a) -> Vector a -> m () -- | O(n) Monadic fold that discards the result (action applied to -- each element and its index) ifoldM_ :: (Monad m, Unbox b) => (a -> Int -> b -> m a) -> a -> Vector b -> m () -- | O(n) Monadic fold that discards the result foldM_ :: (Monad m, Unbox b) => (a -> b -> m a) -> a -> Vector b -> m () -- | O(n) Monadic fold over non-empty vectors with strict -- accumulator fold1M' :: (Monad m, Unbox a) => (a -> a -> m a) -> Vector a -> m a -- | O(n) Monadic fold with strict accumulator (action applied to -- each element and its index) ifoldM' :: (Monad m, Unbox b) => (a -> Int -> b -> m a) -> a -> Vector b -> m a -- | O(n) Monadic fold with strict accumulator foldM' :: (Monad m, Unbox b) => (a -> b -> m a) -> a -> Vector b -> m a -- | O(n) Monadic fold over non-empty vectors fold1M :: (Monad m, Unbox a) => (a -> a -> m a) -> Vector a -> m a -- | O(n) Monadic fold (action applied to each element and its -- index) ifoldM :: (Monad m, Unbox b) => (a -> Int -> b -> m a) -> a -> Vector b -> m a -- | O(n) Monadic fold foldM :: (Monad m, Unbox b) => (a -> b -> m a) -> a -> Vector b -> m a -- | O(n) Yield the index of the minimum element of the vector -- according to the given comparison function. The vector may not be -- empty. minIndexBy :: Unbox a => (a -> a -> Ordering) -> Vector a -> Int -- | O(n) Yield the index of the minimum element of the vector. The -- vector may not be empty. minIndex :: (Unbox a, Ord a) => Vector a -> Int -- | O(n) Yield the index of the maximum element of the vector -- according to the given comparison function. The vector may not be -- empty. maxIndexBy :: Unbox a => (a -> a -> Ordering) -> Vector a -> Int -- | O(n) Yield the index of the maximum element of the vector. The -- vector may not be empty. maxIndex :: (Unbox a, Ord a) => Vector a -> Int -- | O(n) Yield the minimum element of the vector according to the -- given comparison function. The vector may not be empty. minimumBy :: Unbox a => (a -> a -> Ordering) -> Vector a -> a -- | O(n) Yield the minimum element of the vector. The vector may -- not be empty. minimum :: (Unbox a, Ord a) => Vector a -> a -- | O(n) Yield the maximum element of the vector according to the -- given comparison function. The vector may not be empty. maximumBy :: Unbox a => (a -> a -> Ordering) -> Vector a -> a -- | O(n) Yield the maximum element of the vector. The vector may -- not be empty. maximum :: (Unbox a, Ord a) => Vector a -> a -- | O(n) Compute the produce of the elements product :: (Unbox a, Num a) => Vector a -> a -- | O(n) Compute the sum of the elements sum :: (Unbox a, Num a) => Vector a -> a -- | O(n) Right fold with strict accumulator (function applied to -- each element and its index) ifoldr' :: Unbox a => (Int -> a -> b -> b) -> b -> Vector a -> b -- | O(n) Right fold (function applied to each element and its -- index) ifoldr :: Unbox a => (Int -> a -> b -> b) -> b -> Vector a -> b -- | O(n) Left fold with strict accumulator (function applied to -- each element and its index) ifoldl' :: Unbox b => (a -> Int -> b -> a) -> a -> Vector b -> a -- | O(n) Left fold (function applied to each element and its index) ifoldl :: Unbox b => (a -> Int -> b -> a) -> a -> Vector b -> a -- | O(n) Right fold on non-empty vectors with strict accumulator foldr1' :: Unbox a => (a -> a -> a) -> Vector a -> a -- | O(n) Right fold with a strict accumulator foldr' :: Unbox a => (a -> b -> b) -> b -> Vector a -> b -- | O(n) Right fold on non-empty vectors foldr1 :: Unbox a => (a -> a -> a) -> Vector a -> a -- | O(n) Right fold foldr :: Unbox a => (a -> b -> b) -> b -> Vector a -> b -- | O(n) Left fold on non-empty vectors with strict accumulator foldl1' :: Unbox a => (a -> a -> a) -> Vector a -> a -- | O(n) Left fold with strict accumulator foldl' :: Unbox b => (a -> b -> a) -> a -> Vector b -> a -- | O(n) Left fold on non-empty vectors foldl1 :: Unbox a => (a -> a -> a) -> Vector a -> a -- | O(n) Left fold foldl :: Unbox b => (a -> b -> a) -> a -> Vector b -> a -- | O(n) Yield the indices of all occurences of the given element -- in ascending order. This is a specialised version of -- findIndices. elemIndices :: (Unbox a, Eq a) => a -> Vector a -> Vector Int -- | O(n) Yield Just the index of the first occurence of the -- given element or Nothing if the vector does not contain the -- element. This is a specialised version of findIndex. elemIndex :: (Unbox a, Eq a) => a -> Vector a -> Maybe Int -- | O(n) Yield the indices of elements satisfying the predicate in -- ascending order. findIndices :: Unbox a => (a -> Bool) -> Vector a -> Vector Int -- | O(n) Yield Just the first element matching the predicate -- or Nothing if no such element exists. find :: Unbox a => (a -> Bool) -> Vector a -> Maybe a -- | O(n) Check if the vector does not contain an element (inverse -- of elem) notElem :: (Unbox a, Eq a) => a -> Vector a -> Bool infix 4 `notElem` -- | O(n) Check if the vector contains an element elem :: (Unbox a, Eq a) => a -> Vector a -> Bool infix 4 `elem` -- | O(n) Split the vector into the longest prefix of elements that -- do not satisfy the predicate and the rest without copying. break :: Unbox a => (a -> Bool) -> Vector a -> (Vector a, Vector a) -- | O(n) Split the vector into the longest prefix of elements that -- satisfy the predicate and the rest without copying. span :: Unbox a => (a -> Bool) -> Vector a -> (Vector a, Vector a) -- | O(n) Split the vector in two parts, the first one containing -- those elements that satisfy the predicate and the second one those -- that don't. The order of the elements is not preserved but the -- operation is often faster than partition. unstablePartition :: Unbox a => (a -> Bool) -> Vector a -> (Vector a, Vector a) -- | O(n) Split the vector in two parts, the first one containing -- those elements that satisfy the predicate and the second one those -- that don't. The relative order of the elements is preserved at the -- cost of a sometimes reduced performance compared to -- unstablePartition. partition :: Unbox a => (a -> Bool) -> Vector a -> (Vector a, Vector a) -- | O(n) Drop the longest prefix of elements that satisfy the -- predicate without copying. dropWhile :: Unbox a => (a -> Bool) -> Vector a -> Vector a -- | O(n) Yield the longest prefix of elements satisfying the -- predicate without copying. takeWhile :: Unbox a => (a -> Bool) -> Vector a -> Vector a -- | O(n) Drop elements that do not satisfy the monadic predicate filterM :: (Monad m, Unbox a) => (a -> m Bool) -> Vector a -> m (Vector a) -- | O(n) Drop elements when predicate, applied to index and value, -- returns Nothing imapMaybe :: (Unbox a, Unbox b) => (Int -> a -> Maybe b) -> Vector a -> Vector b -- | O(n) Drop elements when predicate returns Nothing mapMaybe :: (Unbox a, Unbox b) => (a -> Maybe b) -> Vector a -> Vector b -- | O(n) Drop elements that do not satisfy the predicate which is -- applied to values and their indices ifilter :: Unbox a => (Int -> a -> Bool) -> Vector a -> Vector a -- | O(n) Drop repeated adjacent elements. uniq :: (Unbox a, Eq a) => Vector a -> Vector a -- | O(n) Drop elements that do not satisfy the predicate filter :: Unbox a => (a -> Bool) -> Vector a -> Vector a -- | O(min(m,n)) Zip the two vectors with a monadic action that also -- takes the element index and ignore the results izipWithM_ :: (Monad m, Unbox a, Unbox b) => (Int -> a -> b -> m c) -> Vector a -> Vector b -> m () -- | O(min(m,n)) Zip the two vectors with the monadic action and -- ignore the results zipWithM_ :: (Monad m, Unbox a, Unbox b) => (a -> b -> m c) -> Vector a -> Vector b -> m () -- | O(min(m,n)) Zip the two vectors with a monadic action that also -- takes the element index and yield a vector of results izipWithM :: (Monad m, Unbox a, Unbox b, Unbox c) => (Int -> a -> b -> m c) -> Vector a -> Vector b -> m (Vector c) -- | O(min(m,n)) Zip the two vectors with the monadic action and -- yield a vector of results zipWithM :: (Monad m, Unbox a, Unbox b, Unbox c) => (a -> b -> m c) -> Vector a -> Vector b -> m (Vector c) izipWith6 :: (Unbox a, Unbox b, Unbox c, Unbox d, Unbox e, Unbox f, Unbox g) => (Int -> a -> b -> c -> d -> e -> f -> g) -> Vector a -> Vector b -> Vector c -> Vector d -> Vector e -> Vector f -> Vector g izipWith5 :: (Unbox a, Unbox b, Unbox c, Unbox d, Unbox e, Unbox f) => (Int -> a -> b -> c -> d -> e -> f) -> Vector a -> Vector b -> Vector c -> Vector d -> Vector e -> Vector f izipWith4 :: (Unbox a, Unbox b, Unbox c, Unbox d, Unbox e) => (Int -> a -> b -> c -> d -> e) -> Vector a -> Vector b -> Vector c -> Vector d -> Vector e -- | Zip three vectors and their indices with the given function. izipWith3 :: (Unbox a, Unbox b, Unbox c, Unbox d) => (Int -> a -> b -> c -> d) -> Vector a -> Vector b -> Vector c -> Vector d -- | O(min(m,n)) Zip two vectors with a function that also takes the -- elements' indices. izipWith :: (Unbox a, Unbox b, Unbox c) => (Int -> a -> b -> c) -> Vector a -> Vector b -> Vector c zipWith6 :: (Unbox a, Unbox b, Unbox c, Unbox d, Unbox e, Unbox f, Unbox g) => (a -> b -> c -> d -> e -> f -> g) -> Vector a -> Vector b -> Vector c -> Vector d -> Vector e -> Vector f -> Vector g zipWith5 :: (Unbox a, Unbox b, Unbox c, Unbox d, Unbox e, Unbox f) => (a -> b -> c -> d -> e -> f) -> Vector a -> Vector b -> Vector c -> Vector d -> Vector e -> Vector f zipWith4 :: (Unbox a, Unbox b, Unbox c, Unbox d, Unbox e) => (a -> b -> c -> d -> e) -> Vector a -> Vector b -> Vector c -> Vector d -> Vector e -- | Zip three vectors with the given function. zipWith3 :: (Unbox a, Unbox b, Unbox c, Unbox d) => (a -> b -> c -> d) -> Vector a -> Vector b -> Vector c -> Vector d -- | O(min(m,n)) Zip two vectors with the given function. zipWith :: (Unbox a, Unbox b, Unbox c) => (a -> b -> c) -> Vector a -> Vector b -> Vector c -- | O(n) Apply the monadic action to all elements of a vector and -- ignore the results. Equivalent to flip mapM_. forM_ :: (Monad m, Unbox a) => Vector a -> (a -> m b) -> m () -- | O(n) Apply the monadic action to all elements of the vector, -- yielding a vector of results. Equivalent to flip mapM. forM :: (Monad m, Unbox a, Unbox b) => Vector a -> (a -> m b) -> m (Vector b) -- | O(n) Apply the monadic action to every element of a vector and -- its index, ignoring the results imapM_ :: (Monad m, Unbox a) => (Int -> a -> m b) -> Vector a -> m () -- | O(n) Apply the monadic action to all elements of a vector and -- ignore the results mapM_ :: (Monad m, Unbox a) => (a -> m b) -> Vector a -> m () -- | O(n) Apply the monadic action to every element of a vector and -- its index, yielding a vector of results imapM :: (Monad m, Unbox a, Unbox b) => (Int -> a -> m b) -> Vector a -> m (Vector b) -- | O(n) Apply the monadic action to all elements of the vector, -- yielding a vector of results mapM :: (Monad m, Unbox a, Unbox b) => (a -> m b) -> Vector a -> m (Vector b) -- | Map a function over a vector and concatenate the results. concatMap :: (Unbox a, Unbox b) => (a -> Vector b) -> Vector a -> Vector b -- | O(n) Apply a function to every element of a vector and its -- index imap :: (Unbox a, Unbox b) => (Int -> a -> b) -> Vector a -> Vector b -- | O(n) Map a function over a vector map :: (Unbox a, Unbox b) => (a -> b) -> Vector a -> Vector b -- | O(n) Pair each element in a vector with its index indexed :: Unbox a => Vector a -> Vector (Int, a) -- | Apply a destructive operation to a vector. The operation will be -- performed in place if it is safe to do so and will modify a copy of -- the vector otherwise. -- --
-- modify (\v -> write v 0 'x') (replicate 3 'a') = <'x','a','a'> --modify :: Unbox a => (forall s. () => MVector s a -> ST s ()) -> Vector a -> Vector a -- | Same as backpermute but without bounds checking. unsafeBackpermute :: Unbox a => Vector a -> Vector Int -> Vector a -- | O(n) Yield the vector obtained by replacing each element -- i of the index vector by xs!i. This is -- equivalent to map (xs!) is but is often much -- more efficient. -- --
-- backpermute <a,b,c,d> <0,3,2,3,1,0> = <a,d,c,d,b,a> --backpermute :: Unbox a => Vector a -> Vector Int -> Vector a -- | Same as accumulate_ but without bounds checking. unsafeAccumulate_ :: (Unbox a, Unbox b) => (a -> b -> a) -> Vector a -> Vector Int -> Vector b -> Vector a -- | Same as accumulate but without bounds checking. unsafeAccumulate :: (Unbox a, Unbox b) => (a -> b -> a) -> Vector a -> Vector (Int, b) -> Vector a -- | Same as accum but without bounds checking. unsafeAccum :: Unbox a => (a -> b -> a) -> Vector a -> [(Int, b)] -> Vector a -- | O(m+min(n1,n2)) For each index i from the index vector -- and the corresponding value b from the the value vector, -- replace the element of the initial vector at position i by -- f a b. -- --
-- accumulate_ (+) <5,9,2> <2,1,0,1> <4,6,3,7> = <5+3, 9+6+7, 2+4> ---- -- The function accumulate provides the same functionality and is -- usually more convenient. -- --
-- accumulate_ f as is bs = accumulate f as (zip is bs) --accumulate_ :: (Unbox a, Unbox b) => (a -> b -> a) -> Vector a -> Vector Int -> Vector b -> Vector a -- | O(m+n) For each pair (i,b) from the vector of pairs, -- replace the vector element a at position i by f -- a b. -- --
-- accumulate (+) <5,9,2> <(2,4),(1,6),(0,3),(1,7)> = <5+3, 9+6+7, 2+4> --accumulate :: (Unbox a, Unbox b) => (a -> b -> a) -> Vector a -> Vector (Int, b) -> Vector a -- | O(m+n) For each pair (i,b) from the list, replace the -- vector element a at position i by f a b. -- --
-- accum (+) <5,9,2> [(2,4),(1,6),(0,3),(1,7)] = <5+3, 9+6+7, 2+4> --accum :: Unbox a => (a -> b -> a) -> Vector a -> [(Int, b)] -> Vector a -- | Same as update_ but without bounds checking. unsafeUpdate_ :: Unbox a => Vector a -> Vector Int -> Vector a -> Vector a -- | Same as update but without bounds checking. unsafeUpdate :: Unbox a => Vector a -> Vector (Int, a) -> Vector a -- | Same as (//) but without bounds checking. unsafeUpd :: Unbox a => Vector a -> [(Int, a)] -> Vector a -- | O(m+min(n1,n2)) For each index i from the index vector -- and the corresponding value a from the value vector, replace -- the element of the initial vector at position i by -- a. -- --
-- update_ <5,9,2,7> <2,0,2> <1,3,8> = <3,9,8,7> ---- -- The function update provides the same functionality and is -- usually more convenient. -- --
-- update_ xs is ys = update xs (zip is ys) --update_ :: Unbox a => Vector a -> Vector Int -> Vector a -> Vector a -- | O(m+n) For each pair (i,a) from the vector of -- index/value pairs, replace the vector element at position i -- by a. -- --
-- update <5,9,2,7> <(2,1),(0,3),(2,8)> = <3,9,8,7> --update :: Unbox a => Vector a -> Vector (Int, a) -> Vector a -- | O(m+n) For each pair (i,a) from the list, replace the -- vector element at position i by a. -- --
-- <5,9,2,7> // [(2,1),(0,3),(2,8)] = <3,9,8,7> --(//) :: Unbox a => Vector a -> [(Int, a)] -> Vector a -- | O(n) Yield the argument but force it not to retain any extra -- memory, possibly by copying it. -- -- This is especially useful when dealing with slices. For example: -- --
-- force (slice 0 2 <huge vector>) ---- -- Here, the slice retains a reference to the huge vector. Forcing it -- creates a copy of just the elements that belong to the slice and -- allows the huge vector to be garbage collected. force :: Unbox a => Vector a -> Vector a -- | Execute the monadic action and freeze the resulting vectors. createT :: (Traversable f, Unbox a) => (forall s. () => ST s (f (MVector s a))) -> f (Vector a) -- | Execute the monadic action and freeze the resulting vector. -- --
-- create (do { v <- new 2; write v 0 'a'; write v 1 'b'; return v }) = <a,b>
--
create :: Unbox a => (forall s. () => ST s (MVector s a)) -> Vector a
-- | O(n) Apply monadic function n times to value. Zeroth element is
-- original value.
iterateNM :: (Monad m, Unbox a) => Int -> (a -> m a) -> a -> m (Vector a)
-- | O(n) Construct a vector of the given length by applying the
-- monadic action to each index
generateM :: (Monad m, Unbox a) => Int -> (Int -> m a) -> m (Vector a)
-- | O(n) Execute the monadic action the given number of times and
-- store the results in a vector.
replicateM :: (Monad m, Unbox a) => Int -> m a -> m (Vector a)
-- | O(n) Concatenate all vectors in the list
concat :: Unbox a => [Vector a] -> Vector a
-- | O(m+n) Concatenate two vectors
(++) :: Unbox a => Vector a -> Vector a -> Vector a
infixr 5 ++
-- | O(n) Append an element
snoc :: Unbox a => Vector a -> a -> Vector a
-- | O(n) Prepend an element
cons :: Unbox a => a -> Vector a -> Vector a
-- | O(n) Enumerate values from x to y with a
-- specific step z.
--
-- WARNING: This operation can be very inefficient. If at all
-- possible, use enumFromStepN instead.
enumFromThenTo :: (Unbox a, Enum a) => a -> a -> a -> Vector a
-- | O(n) Enumerate values from x to y.
--
-- WARNING: This operation can be very inefficient. If at all
-- possible, use enumFromN instead.
enumFromTo :: (Unbox a, Enum a) => a -> a -> Vector a
-- | O(n) Yield a vector of the given length containing the values
-- x, x+y, x+y+y etc. This operations is
-- usually more efficient than enumFromThenTo.
--
-- -- enumFromStepN 1 0.1 5 = <1,1.1,1.2,1.3,1.4> --enumFromStepN :: (Unbox a, Num a) => a -> a -> Int -> Vector a -- | O(n) Yield a vector of the given length containing the values -- x, x+1 etc. This operation is usually more efficient -- than enumFromTo. -- --
-- enumFromN 5 3 = <5,6,7> --enumFromN :: (Unbox a, Num a) => a -> Int -> Vector a -- | O(n) Construct a vector with n elements from right to -- left by repeatedly applying the generator function to the already -- constructed part of the vector. -- --
-- constructrN 3 f = let a = f <> ; b = f<a> ; c = f <b,a> in f <c,b,a> --constructrN :: Unbox a => Int -> (Vector a -> a) -> Vector a -- | O(n) Construct a vector with n elements by repeatedly -- applying the generator function to the already constructed part of the -- vector. -- --
-- constructN 3 f = let a = f <> ; b = f <a> ; c = f <a,b> in f <a,b,c> --constructN :: Unbox a => Int -> (Vector a -> a) -> Vector a -- | O(n) Construct a vector by repeatedly applying the monadic -- generator function to a seed. The generator function yields -- Just the next element and the new seed or Nothing if -- there are no more elements. unfoldrNM :: (Monad m, Unbox a) => Int -> (b -> m (Maybe (a, b))) -> b -> m (Vector a) -- | O(n) Construct a vector by repeatedly applying the monadic -- generator function to a seed. The generator function yields -- Just the next element and the new seed or Nothing if -- there are no more elements. unfoldrM :: (Monad m, Unbox a) => (b -> m (Maybe (a, b))) -> b -> m (Vector a) -- | O(n) Construct a vector with at most n elements by -- repeatedly applying the generator function to a seed. The generator -- function yields Just the next element and the new seed or -- Nothing if there are no more elements. -- --
-- unfoldrN 3 (\n -> Just (n,n-1)) 10 = <10,9,8> --unfoldrN :: Unbox a => Int -> (b -> Maybe (a, b)) -> b -> Vector a -- | O(n) Construct a vector by repeatedly applying the generator -- function to a seed. The generator function yields Just the next -- element and the new seed or Nothing if there are no more -- elements. -- --
-- unfoldr (\n -> if n == 0 then Nothing else Just (n,n-1)) 10 -- = <10,9,8,7,6,5,4,3,2,1> --unfoldr :: Unbox a => (b -> Maybe (a, b)) -> b -> Vector a -- | O(n) Apply function n times to value. Zeroth element is -- original value. iterateN :: Unbox a => Int -> (a -> a) -> a -> Vector a -- | O(n) Construct a vector of the given length by applying the -- function to each index generate :: Unbox a => Int -> (Int -> a) -> Vector a -- | O(n) Vector of the given length with the same value in each -- position replicate :: Unbox a => Int -> a -> Vector a -- | O(1) Vector with exactly one element singleton :: Unbox a => a -> Vector a -- | O(1) Empty vector empty :: Unbox a => Vector a -- | O(1) Yield all but the first n elements without -- copying. The vector must contain at least n elements but this -- is not checked. unsafeDrop :: Unbox a => Int -> Vector a -> Vector a -- | O(1) Yield the first n elements without copying. The -- vector must contain at least n elements but this is not -- checked. unsafeTake :: Unbox a => Int -> Vector a -> Vector a -- | O(1) Yield all but the first element without copying. The -- vector may not be empty but this is not checked. unsafeTail :: Unbox a => Vector a -> Vector a -- | O(1) Yield all but the last element without copying. The vector -- may not be empty but this is not checked. unsafeInit :: Unbox a => Vector a -> Vector a -- | O(1) Yield a slice of the vector without copying. The vector -- must contain at least i+n elements but this is not checked. unsafeSlice :: Unbox a => Int -> Int -> Vector a -> Vector a -- | O(1) Yield the first n elements paired with the -- remainder without copying. -- -- Note that splitAt n v is equivalent to -- (take n v, drop n v) but slightly more -- efficient. splitAt :: Unbox a => Int -> Vector a -> (Vector a, Vector a) -- | O(1) Yield all but the first n elements without -- copying. The vector may contain less than n elements in which -- case an empty vector is returned. drop :: Unbox a => Int -> Vector a -> Vector a -- | O(1) Yield at the first n elements without copying. -- The vector may contain less than n elements in which case it -- is returned unchanged. take :: Unbox a => Int -> Vector a -> Vector a -- | O(1) Yield all but the first element without copying. The -- vector may not be empty. tail :: Unbox a => Vector a -> Vector a -- | O(1) Yield all but the last element without copying. The vector -- may not be empty. init :: Unbox a => Vector a -> Vector a -- | O(1) Yield a slice of the vector without copying it. The vector -- must contain at least i+n elements. slice :: Unbox a => Int -> Int -> Vector a -> Vector a -- | O(1) Last element in a monad without checking for empty -- vectors. See indexM for an explanation of why this is useful. unsafeLastM :: (Unbox a, Monad m) => Vector a -> m a -- | O(1) First element in a monad without checking for empty -- vectors. See indexM for an explanation of why this is useful. unsafeHeadM :: (Unbox a, Monad m) => Vector a -> m a -- | O(1) Indexing in a monad without bounds checks. See -- indexM for an explanation of why this is useful. unsafeIndexM :: (Unbox a, Monad m) => Vector a -> Int -> m a -- | O(1) Last element of a vector in a monad. See indexM for -- an explanation of why this is useful. lastM :: (Unbox a, Monad m) => Vector a -> m a -- | O(1) First element of a vector in a monad. See indexM -- for an explanation of why this is useful. headM :: (Unbox a, Monad m) => Vector a -> m a -- | O(1) Indexing in a monad. -- -- The monad allows operations to be strict in the vector when necessary. -- Suppose vector copying is implemented like this: -- --
-- copy mv v = ... write mv i (v ! i) ... ---- -- For lazy vectors, v ! i would not be evaluated which means -- that mv would unnecessarily retain a reference to v -- in each element written. -- -- With indexM, copying can be implemented like this instead: -- --
-- copy mv v = ... do -- x <- indexM v i -- write mv i x ---- -- Here, no references to v are retained because indexing (but -- not the elements) is evaluated eagerly. indexM :: (Unbox a, Monad m) => Vector a -> Int -> m a -- | O(1) Last element without checking if the vector is empty unsafeLast :: Unbox a => Vector a -> a -- | O(1) First element without checking if the vector is empty unsafeHead :: Unbox a => Vector a -> a -- | O(1) Unsafe indexing without bounds checking unsafeIndex :: Unbox a => Vector a -> Int -> a -- | O(1) Last element last :: Unbox a => Vector a -> a -- | O(1) First element head :: Unbox a => Vector a -> a -- | O(1) Safe indexing (!?) :: Unbox a => Vector a -> Int -> Maybe a -- | O(1) Indexing (!) :: Unbox a => Vector a -> Int -> a -- | O(1) Test whether a vector is empty null :: Unbox a => Vector a -> Bool -- | O(1) Yield the length of the vector length :: Unbox a => Vector a -> Int data family MVector s a :: Type data family Vector a :: Type class (Vector Vector a, MVector MVector a) => Unbox a -- | O(n) Convert different vector types convert :: (Vector v a, Vector w a) => v a -> w a -- | The number of Bits in a Word. A handy constant to have -- around when defining Word-based bulk operations on bit vectors. wordSize :: Int wordLength :: Vector Bit -> Int -- | Given a number of bits and a vector of words, concatenate them to a -- vector of bits (interpreting the words in little-endian order, as -- described at indexWord). If there are not enough words for the -- number of bits requested, the vector will be zero-padded. fromWords :: Int -> Vector Word -> Vector Bit -- | Given a vector of bits, extract an unboxed vector of words. If the -- bits don't completely fill the words, the last word will be -- zero-padded. toWords :: Vector Bit -> Vector Word -- | read a word at the given bit offset in little-endian order (i.e., the -- LSB will correspond to the bit at the given address, the 2's bit will -- correspond to the address + 1, etc.). If the offset is such that the -- word extends past the end of the vector, the result is zero-padded. indexWord :: Vector Bit -> Int -> Word pad :: Int -> Vector Bit -> Vector Bit padWith :: Bit -> Int -> Vector Bit -> Vector Bit -- | zipWords f xs ys = fromWords (min (length xs) (length -- ys)) (zipWith f (toWords xs) (toWords ys)) zipWords :: (Word -> Word -> Word) -> Vector Bit -> Vector Bit -> Vector Bit union :: Vector Bit -> Vector Bit -> Vector Bit unions :: Int -> [Vector Bit] -> Vector Bit intersection :: Vector Bit -> Vector Bit -> Vector Bit intersections :: Int -> [Vector Bit] -> Vector Bit difference :: Vector Bit -> Vector Bit -> Vector Bit symDiff :: Vector Bit -> Vector Bit -> Vector Bit -- | Flip every bit in the given vector invert :: Vector Bit -> Vector Bit -- | Given a vector of bits and a vector of things, extract those things -- for which the corresponding bit is set. -- -- For example, select (V.map (fromBool . p) x) x == V.filter p -- x. select :: (Vector v1 Bit, Vector v2 t) => v1 Bit -> v2 t -> [t] selectBits :: Vector Bit -> Vector Bit -> Vector Bit -- | Given a vector of bits and a vector of things, extract those things -- for which the corresponding bit is unset. -- -- For example, exclude (V.map (fromBool . p) x) x == V.filter (not . -- p) x. exclude :: (Vector v1 Bit, Vector v2 t) => v1 Bit -> v2 t -> [t] excludeBits :: Vector Bit -> Vector Bit -> Vector Bit -- | return the number of ones in a bit vector countBits :: Vector Bit -> Int listBits :: Vector Bit -> [Int] -- | True if all bits in the vector are set and :: Vector Bit -> Bool -- | True if any bit in the vector is set or :: Vector Bit -> Bool any :: (Bit -> Bool) -> Vector Bit -> Bool anyBits :: Bit -> Vector Bit -> Bool all :: (Bit -> Bool) -> Vector Bit -> Bool allBits :: Bit -> Vector Bit -> Bool reverse :: Vector Bit -> Vector Bit -- | Return the address of the first bit in the vector with the specified -- value, if any first :: Bit -> Vector Bit -> Maybe Int findIndex :: (Bit -> Bool) -> Vector Bit -> Maybe Int