{-# LANGUAGE NoImplicitPrelude, PolymorphicComponents #-}

-- | This module provides a first-class version
-- of the "Data.Vector" module.
module ModularPrelude.Module.Vector
  ( -- * Module interface
    VectorModule (..)
    -- * Module contents
  , VectorImplements (..)
  ) where


import ModularPrelude hiding (empty)
import qualified Data.Vector as Vector


data VectorModule = Vector
  { VectorModule -> forall a b. (a -> b) -> Vector a -> Vector b
map       :: forall a b. (a -> b) -> Vector a -> Vector b
  , VectorModule -> forall a b. (a -> Vector b) -> Vector a -> Vector b
concatMap :: forall a b. (a -> Vector b) -> Vector a -> Vector b
  , VectorModule -> forall a. (a -> Bool) -> Vector a -> Vector a
filter    :: forall a. (a -> Bool) -> Vector a -> Vector a
  , VectorModule -> forall a. Vector a -> Int
length    :: forall a. Vector a -> Int
  , VectorModule -> forall a. a -> Vector a
singleton :: forall a. a -> Vector a
  , VectorModule -> forall a. Vector a -> Bool
null      :: forall a. Vector a -> Bool
  , VectorModule -> forall a. [a] -> Vector a
pack      :: forall a. [a] -> Vector a
  , VectorModule -> forall a. Vector a -> [a]
unpack    :: forall a. Vector a -> [a]
  , VectorModule -> forall a. [a] -> Vector a
fromList  :: forall a. [a] -> Vector a
  , VectorModule -> forall a. Vector a -> [a]
toList    :: forall a. Vector a -> [a]
  , VectorModule
-> forall a b (m :: * -> *).
   Monad m =>
   (a -> m b) -> Vector a -> m (Vector b)
mapM      :: forall a b m. Monad m => (a -> m b) -> Vector a -> m (Vector b)
  , VectorModule
-> forall a b (m :: * -> *).
   Monad m =>
   (a -> m b) -> Vector a -> m ()
mapM_     :: forall a b m. Monad m => (a -> m b) -> Vector a -> m ()
  , VectorModule -> forall a. Vector a
empty     :: forall a. Vector a
  , VectorModule -> forall a. Eq a => a -> Vector a -> Bool
member    :: forall a. Eq a => a -> Vector a -> Bool
  , VectorModule
-> forall a. (a -> Bool) -> Vector a -> (Vector a, Vector a)
break     :: forall a. (a -> Bool) -> Vector a -> (Vector a, Vector a)
  , VectorModule
-> forall a. (a -> Bool) -> Vector a -> (Vector a, Vector a)
span      :: forall a. (a -> Bool) -> Vector a -> (Vector a, Vector a)
  , VectorModule -> forall a. (a -> Bool) -> Vector a -> Vector a
dropWhile :: forall a. (a -> Bool) -> Vector a -> Vector a
  , VectorModule -> forall a. (a -> Bool) -> Vector a -> Vector a
takeWhile :: forall a. (a -> Bool) -> Vector a -> Vector a
  , VectorModule -> forall a. (a -> Bool) -> Vector a -> Bool
any       :: forall a. (a -> Bool) -> Vector a -> Bool
  , VectorModule -> forall a. (a -> Bool) -> Vector a -> Bool
all       :: forall a. (a -> Bool) -> Vector a -> Bool
  , VectorModule -> forall a. Int -> Vector a -> (Vector a, Vector a)
splitAt   :: forall a. Int -> Vector a -> (Vector a, Vector a)
  , VectorModule -> forall a b. (a -> b -> a) -> a -> Vector b -> a
fold      :: forall a b. (a -> b -> a) -> a -> Vector b -> a
  }


class VectorImplements interface where
  _Data_Vector_ :: interface

instance VectorImplements VectorModule where
  _Data_Vector_ :: VectorModule
_Data_Vector_ = Vector
    { map :: forall a b. (a -> b) -> Vector a -> Vector b
map       = (a -> b) -> Vector a -> Vector b
forall a b. (a -> b) -> Vector a -> Vector b
Vector.map
    , concatMap :: forall a b. (a -> Vector b) -> Vector a -> Vector b
concatMap = (a -> Vector b) -> Vector a -> Vector b
forall a b. (a -> Vector b) -> Vector a -> Vector b
Vector.concatMap
    , filter :: forall a. (a -> Bool) -> Vector a -> Vector a
filter    = (a -> Bool) -> Vector a -> Vector a
forall a. (a -> Bool) -> Vector a -> Vector a
Vector.filter
    , length :: forall a. Vector a -> Int
length    = Vector a -> Int
forall a. Vector a -> Int
Vector.length
    , singleton :: forall a. a -> Vector a
singleton = a -> Vector a
forall a. a -> Vector a
Vector.singleton
    , null :: forall a. Vector a -> Bool
null      = Vector a -> Bool
forall a. Vector a -> Bool
Vector.null
    , pack :: forall a. [a] -> Vector a
pack      = [a] -> Vector a
forall a. [a] -> Vector a
Vector.fromList
    , unpack :: forall a. Vector a -> [a]
unpack    = Vector a -> [a]
forall a. Vector a -> [a]
Vector.toList
    , fromList :: forall a. [a] -> Vector a
fromList  = [a] -> Vector a
forall a. [a] -> Vector a
Vector.fromList
    , toList :: forall a. Vector a -> [a]
toList    = Vector a -> [a]
forall a. Vector a -> [a]
Vector.toList
    , mapM :: forall a b (m :: * -> *).
Monad m =>
(a -> m b) -> Vector a -> m (Vector b)
mapM      = (a -> m b) -> Vector a -> m (Vector b)
forall a b (m :: * -> *).
Monad m =>
(a -> m b) -> Vector a -> m (Vector b)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Vector a -> m (Vector b)
Vector.mapM
    , mapM_ :: forall a b (m :: * -> *). Monad m => (a -> m b) -> Vector a -> m ()
mapM_     = (a -> m b) -> Vector a -> m ()
forall a b (m :: * -> *). Monad m => (a -> m b) -> Vector a -> m ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> Vector a -> m ()
Vector.mapM_
    , empty :: forall a. Vector a
empty     = Vector a
forall a. Vector a
Vector.empty
    , member :: forall a. Eq a => a -> Vector a -> Bool
member    = (a -> Bool) -> Vector a -> Bool
forall a. (a -> Bool) -> Vector a -> Bool
Vector.any ((a -> Bool) -> Vector a -> Bool)
-> (a -> a -> Bool) -> a -> Vector a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. a -> a -> Bool
forall a. Eq a => a -> a -> Bool
(==)
    , break :: forall a. (a -> Bool) -> Vector a -> (Vector a, Vector a)
break     = (a -> Bool) -> Vector a -> (Vector a, Vector a)
forall a. (a -> Bool) -> Vector a -> (Vector a, Vector a)
Vector.break
    , span :: forall a. (a -> Bool) -> Vector a -> (Vector a, Vector a)
span      = (a -> Bool) -> Vector a -> (Vector a, Vector a)
forall a. (a -> Bool) -> Vector a -> (Vector a, Vector a)
Vector.span
    , dropWhile :: forall a. (a -> Bool) -> Vector a -> Vector a
dropWhile = (a -> Bool) -> Vector a -> Vector a
forall a. (a -> Bool) -> Vector a -> Vector a
Vector.dropWhile
    , takeWhile :: forall a. (a -> Bool) -> Vector a -> Vector a
takeWhile = (a -> Bool) -> Vector a -> Vector a
forall a. (a -> Bool) -> Vector a -> Vector a
Vector.takeWhile
    , any :: forall a. (a -> Bool) -> Vector a -> Bool
any       = (a -> Bool) -> Vector a -> Bool
forall a. (a -> Bool) -> Vector a -> Bool
Vector.any
    , all :: forall a. (a -> Bool) -> Vector a -> Bool
all       = (a -> Bool) -> Vector a -> Bool
forall a. (a -> Bool) -> Vector a -> Bool
Vector.all
    , splitAt :: forall a. Int -> Vector a -> (Vector a, Vector a)
splitAt   = Int -> Vector a -> (Vector a, Vector a)
forall a. Int -> Vector a -> (Vector a, Vector a)
Vector.splitAt
    , fold :: forall a b. (a -> b -> a) -> a -> Vector b -> a
fold      = (a -> b -> a) -> a -> Vector b -> a
forall a b. (a -> b -> a) -> a -> Vector b -> a
Vector.foldl'
    }


instance Default VectorModule where
  def :: VectorModule
def = VectorModule
forall interface. VectorImplements interface => interface
_Data_Vector_