{-# LANGUAGE CPP #-}

-- | Generic @Vector@ interface. Import as:
--
-- > import qualified RIO.Vector as V
--
-- This module does not export any partial or unsafe functions.  For those, see
-- "RIO.Vector.Partial" and "RIO.Vector.Unsafe"
module RIO.Vector
  (
  -- * Immutable vectors
    Data.Vector.Generic.Vector

  -- * Accessors
  -- ** Length information
  , Data.Vector.Generic.length
  , Data.Vector.Generic.null

  -- ** Indexing
  , (Data.Vector.Generic.!?)

  -- ** Extracting subvectors
  , Data.Vector.Generic.slice
  , Data.Vector.Generic.take
  , Data.Vector.Generic.drop
  , Data.Vector.Generic.splitAt

  -- * Construction
  -- ** Initialisation
  , Data.Vector.Generic.empty
  , Data.Vector.Generic.singleton
  , Data.Vector.Generic.replicate
  , Data.Vector.Generic.generate
  , Data.Vector.Generic.iterateN

  -- ** Monadic initialisation
  , Data.Vector.Generic.replicateM
  , Data.Vector.Generic.generateM
#if MIN_VERSION_vector(0,12,0)
  , Data.Vector.Generic.iterateNM
#endif
  , Data.Vector.Generic.create
#if MIN_VERSION_vector(0,12,0)
  , Data.Vector.Generic.createT
#endif

  -- ** Unfolding
  , Data.Vector.Generic.unfoldr
  , Data.Vector.Generic.unfoldrN
#if MIN_VERSION_vector(0,12,0)
  , Data.Vector.Generic.unfoldrM
  , Data.Vector.Generic.unfoldrNM
#endif
  , Data.Vector.Generic.constructN
  , Data.Vector.Generic.constructrN

  -- ** Enumeration
  , Data.Vector.Generic.enumFromN
  , Data.Vector.Generic.enumFromStepN
  , Data.Vector.Generic.enumFromTo
  , Data.Vector.Generic.enumFromThenTo

  -- ** Concatenation
  , Data.Vector.Generic.cons
  , Data.Vector.Generic.snoc
  , (Data.Vector.Generic.++)
  , Data.Vector.Generic.concat
#if MIN_VERSION_vector(0,12,0)
  , Data.Vector.Generic.concatNE
#endif

  -- ** Restricting memory usage
  , Data.Vector.Generic.force

  -- * Modifying vectors
  -- ** Permutations
  , Data.Vector.Generic.reverse

  -- ** Safe destructive update
  , Data.Vector.Generic.modify

  -- * Elementwise operations
  -- ** Indexing
  , Data.Vector.Generic.indexed

  -- ** Mapping
  , Data.Vector.Generic.map
  , Data.Vector.Generic.imap
  , Data.Vector.Generic.concatMap

  -- ** Monadic mapping
  , Data.Vector.Generic.mapM
  , Data.Vector.Generic.imapM
  , Data.Vector.Generic.mapM_
  , Data.Vector.Generic.imapM_
  , Data.Vector.Generic.forM
  , Data.Vector.Generic.forM_

  -- ** Zipping
  , Data.Vector.Generic.zipWith
  , Data.Vector.Generic.zipWith3
  , Data.Vector.Generic.zipWith4
  , Data.Vector.Generic.zipWith5
  , Data.Vector.Generic.zipWith6
  , Data.Vector.Generic.izipWith
  , Data.Vector.Generic.izipWith3
  , Data.Vector.Generic.izipWith4
  , Data.Vector.Generic.izipWith5
  , Data.Vector.Generic.izipWith6
  , Data.Vector.Generic.zip
  , Data.Vector.Generic.zip3
  , Data.Vector.Generic.zip4
  , Data.Vector.Generic.zip5
  , Data.Vector.Generic.zip6

  -- ** Monadic zipping
  , Data.Vector.Generic.zipWithM
  , Data.Vector.Generic.izipWithM
  , Data.Vector.Generic.zipWithM_
  , Data.Vector.Generic.izipWithM_

  -- ** Unzipping
  , Data.Vector.Generic.unzip
  , Data.Vector.Generic.unzip3
  , Data.Vector.Generic.unzip4
  , Data.Vector.Generic.unzip5
  , Data.Vector.Generic.unzip6

  -- * Working with predicates
  -- ** Filtering
  , Data.Vector.Generic.filter
  , Data.Vector.Generic.ifilter
#if MIN_VERSION_vector(0,12,0)
  , Data.Vector.Generic.uniq
  , Data.Vector.Generic.mapMaybe
  , Data.Vector.Generic.imapMaybe
#endif
  , Data.Vector.Generic.filterM
  , Data.Vector.Generic.takeWhile
  , Data.Vector.Generic.dropWhile

  -- ** Partitioning
  , Data.Vector.Generic.partition
  , Data.Vector.Generic.unstablePartition
  , Data.Vector.Generic.span
  , Data.Vector.Generic.break

  -- ** Searching
  , Data.Vector.Generic.elem
  , Data.Vector.Generic.notElem
  , Data.Vector.Generic.find
  , Data.Vector.Generic.findIndex
  , Data.Vector.Generic.findIndices
  , Data.Vector.Generic.elemIndex
  , Data.Vector.Generic.elemIndices

  -- * Folding
  , Data.Vector.Generic.foldl
  , Data.Vector.Generic.foldl'
  , Data.Vector.Generic.foldr
  , Data.Vector.Generic.foldr'
  , Data.Vector.Generic.ifoldl
  , Data.Vector.Generic.ifoldl'
  , Data.Vector.Generic.ifoldr
  , Data.Vector.Generic.ifoldr'

  -- ** Specialised folds
  , Data.Vector.Generic.all
  , Data.Vector.Generic.any
  , Data.Vector.Generic.and
  , Data.Vector.Generic.or
  , Data.Vector.Generic.sum
  , Data.Vector.Generic.product

  -- ** Monadic folds
  , Data.Vector.Generic.foldM
  , Data.Vector.Generic.ifoldM
  , Data.Vector.Generic.foldM'
  , Data.Vector.Generic.ifoldM'
  , Data.Vector.Generic.foldM_
  , Data.Vector.Generic.ifoldM_
  , Data.Vector.Generic.foldM'_
  , Data.Vector.Generic.ifoldM'_

  -- ** Monadic sequencing
  , Data.Vector.Generic.sequence
  , Data.Vector.Generic.sequence_

  -- * Prefix sums (scans)
  , Data.Vector.Generic.prescanl
  , Data.Vector.Generic.prescanl'
  , Data.Vector.Generic.postscanl
  , Data.Vector.Generic.postscanl'
  , Data.Vector.Generic.scanl
  , Data.Vector.Generic.scanl'
#if MIN_VERSION_vector(0,12,0)
  , Data.Vector.Generic.iscanl
  , Data.Vector.Generic.iscanl'
#endif
  , Data.Vector.Generic.prescanr
  , Data.Vector.Generic.prescanr'
  , Data.Vector.Generic.postscanr
  , Data.Vector.Generic.postscanr'
  , Data.Vector.Generic.scanr
  , Data.Vector.Generic.scanr'
#if MIN_VERSION_vector(0,12,0)
  , Data.Vector.Generic.iscanr
  , Data.Vector.Generic.iscanr'
#endif

  -- * Conversions
  -- ** Lists
  , Data.Vector.Generic.toList
  , Data.Vector.Generic.fromList
  , Data.Vector.Generic.fromListN

  -- ** Different vector types
  , Data.Vector.Generic.convert

  -- ** Mutable vectors
  , Data.Vector.Generic.freeze
  , Data.Vector.Generic.thaw
  , Data.Vector.Generic.copy

  -- * Fusion support
  -- ** Conversion to/from Bundles
  , Data.Vector.Generic.stream
  , Data.Vector.Generic.unstream
  , Data.Vector.Generic.streamR
  , Data.Vector.Generic.unstreamR

  -- ** Recycling support
  , Data.Vector.Generic.new
  , Data.Vector.Generic.clone

  -- * Utilities
  -- ** Comparisons
  , Data.Vector.Generic.eq
  , Data.Vector.Generic.cmp
#if MIN_VERSION_vector(0,12,0)
  , Data.Vector.Generic.eqBy
  , Data.Vector.Generic.cmpBy
#endif

  -- ** Show and Read
  , Data.Vector.Generic.showsPrec
  , Data.Vector.Generic.readPrec
#if MIN_VERSION_vector(0,12,0)
  , Data.Vector.Generic.liftShowsPrec
  , Data.Vector.Generic.liftReadsPrec
#endif

  -- ** @Data@ and @Typeable@
  , Data.Vector.Generic.gfoldl
  , Data.Vector.Generic.dataCast
  , Data.Vector.Generic.mkType
  ) where

import qualified Data.Vector.Generic