-- |
-- The @'Vector' a@ type is an persistent vector of elements of type @a@.
--
-- This module should be imported qualified, to avoid name clashes with the "Prelude".
-- 
-- Many operations have a average-case complexity of /O(log n)/.  The
-- implementation uses a large base (i.e. 32) so in practice these
-- operations are constant time.
--
-- = Comparison with Data.RRBVector and Data.Sequence
-- * Persistent vectors generally have less operations than sequences or RRBVectors but those operations can be faster.
-- * Persistent vectors have the fastest indexing.
-- * Persistent vectors are faster than RRBVectors at snocing because of tail optimization.
--   Snocing is a near constant time operation.
--   Snocing is still slower than sequences.
-- * RRBVectors are faster than persistent vectors at splitting and merging, but still slower than sequences.
-- * RRBVectors are faster than Sequences at indexing but slower than persistent vectors.
-- * Sequences have the fastest consing, snocing, and merging, but the slowest indexing.
-- 
-- ![diagram](docs/diagram.png)
module Data.Vector.Persistent
  ( foldr,
    foldr',
    foldl,
    foldl',
    Vector ((:|>), Empty),
    (|>),
    empty,
    length,
    lookup,
    index,
    (!?),
    (!),
    update,
    adjust,
    adjustF,
    snoc,
    singleton,
    null,
    (//),
    (><),
    map,
    traverse,
    toList,
    fromList,
    unsnoc,
  )
where

import Data.Vector.Persistent.Internal
import Prelude hiding
  ( filter,
    foldl,
    foldr,
    length,
    lookup,
    map,
    null,
    reverse,
    traverse,
  )