{-# LANGUAGE NoImplicitPrelude, PolymorphicComponents #-}

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


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


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


class UVectorImplements interface where
  _Data_Vector_Unboxed_ :: interface

instance UVectorImplements UVectorModule where
  _Data_Vector_Unboxed_ :: UVectorModule
_Data_Vector_Unboxed_ = UVector
    { map :: forall a b.
(Unbox a, Unbox b) =>
(a -> b) -> UVector a -> UVector b
map       = (a -> b) -> Vector a -> Vector b
forall a b.
(Unbox a, Unbox b) =>
(a -> b) -> UVector a -> UVector b
UVector.map
    , concatMap :: forall a b.
(Unbox a, Unbox b) =>
(a -> UVector b) -> UVector a -> UVector b
concatMap = (a -> Vector b) -> Vector a -> Vector b
forall a b.
(Unbox a, Unbox b) =>
(a -> UVector b) -> UVector a -> UVector b
UVector.concatMap
    , filter :: forall a. Unbox a => (a -> Bool) -> UVector a -> UVector a
filter    = (a -> Bool) -> Vector a -> Vector a
forall a. Unbox a => (a -> Bool) -> UVector a -> UVector a
UVector.filter
    , length :: forall a. Unbox a => UVector a -> Int
length    = Vector a -> Int
forall a. Unbox a => UVector a -> Int
UVector.length
    , singleton :: forall a. Unbox a => a -> UVector a
singleton = a -> Vector a
forall a. Unbox a => a -> UVector a
UVector.singleton
    , null :: forall a. Unbox a => UVector a -> Bool
null      = Vector a -> Bool
forall a. Unbox a => UVector a -> Bool
UVector.null
    , pack :: forall a. Unbox a => [a] -> UVector a
pack      = [a] -> Vector a
forall a. Unbox a => [a] -> UVector a
UVector.fromList
    , unpack :: forall a. Unbox a => UVector a -> [a]
unpack    = Vector a -> [a]
forall a. Unbox a => UVector a -> [a]
UVector.toList
    , fromList :: forall a. Unbox a => [a] -> UVector a
fromList  = [a] -> Vector a
forall a. Unbox a => [a] -> UVector a
UVector.fromList
    , toList :: forall a. Unbox a => UVector a -> [a]
toList    = Vector a -> [a]
forall a. Unbox a => UVector a -> [a]
UVector.toList
    , mapM :: forall a b (m :: * -> *).
(Unbox a, Unbox b, Monad m) =>
(a -> m b) -> UVector a -> m (UVector b)
mapM      = (a -> m b) -> Vector a -> m (Vector b)
forall a b (m :: * -> *).
(Unbox a, Unbox b, Monad m) =>
(a -> m b) -> UVector a -> m (UVector b)
forall (m :: * -> *) a b.
(Monad m, Unbox a, Unbox b) =>
(a -> m b) -> Vector a -> m (Vector b)
UVector.mapM
    , mapM_ :: forall a b (m :: * -> *).
(Unbox a, Unbox b, Monad m) =>
(a -> m b) -> UVector a -> m ()
mapM_     = (a -> m b) -> Vector a -> m ()
forall a b (m :: * -> *).
(Unbox a, Unbox b, Monad m) =>
(a -> m b) -> UVector a -> m ()
forall (m :: * -> *) a b.
(Monad m, Unbox a) =>
(a -> m b) -> Vector a -> m ()
UVector.mapM_
    , empty :: forall a. Unbox a => UVector a
empty     = Vector a
forall a. Unbox a => UVector a
UVector.empty
    , member :: forall a. (Unbox a, Eq a) => a -> UVector a -> Bool
member    = (a -> Bool) -> UVector a -> Bool
forall a. Unbox a => (a -> Bool) -> UVector a -> Bool
UVector.any ((a -> Bool) -> UVector a -> Bool)
-> (a -> a -> Bool) -> a -> UVector 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.
Unbox a =>
(a -> Bool) -> UVector a -> (UVector a, UVector a)
break     = (a -> Bool) -> Vector a -> (Vector a, Vector a)
forall a.
Unbox a =>
(a -> Bool) -> UVector a -> (UVector a, UVector a)
UVector.break
    , span :: forall a.
Unbox a =>
(a -> Bool) -> UVector a -> (UVector a, UVector a)
span      = (a -> Bool) -> Vector a -> (Vector a, Vector a)
forall a.
Unbox a =>
(a -> Bool) -> UVector a -> (UVector a, UVector a)
UVector.span
    , dropWhile :: forall a. Unbox a => (a -> Bool) -> UVector a -> UVector a
dropWhile = (a -> Bool) -> Vector a -> Vector a
forall a. Unbox a => (a -> Bool) -> UVector a -> UVector a
UVector.dropWhile
    , takeWhile :: forall a. Unbox a => (a -> Bool) -> UVector a -> UVector a
takeWhile = (a -> Bool) -> Vector a -> Vector a
forall a. Unbox a => (a -> Bool) -> UVector a -> UVector a
UVector.takeWhile
    , any :: forall a. Unbox a => (a -> Bool) -> UVector a -> Bool
any       = (a -> Bool) -> Vector a -> Bool
forall a. Unbox a => (a -> Bool) -> UVector a -> Bool
UVector.any
    , all :: forall a. Unbox a => (a -> Bool) -> UVector a -> Bool
all       = (a -> Bool) -> Vector a -> Bool
forall a. Unbox a => (a -> Bool) -> UVector a -> Bool
UVector.all
    , splitAt :: forall a. Unbox a => Int -> UVector a -> (UVector a, UVector a)
splitAt   = Int -> Vector a -> (Vector a, Vector a)
forall a. Unbox a => Int -> UVector a -> (UVector a, UVector a)
UVector.splitAt
    , fold :: forall a b.
(Unbox a, Unbox b) =>
(a -> b -> a) -> a -> UVector b -> a
fold      = (a -> b -> a) -> a -> Vector b -> a
forall a b.
(Unbox a, Unbox b) =>
(a -> b -> a) -> a -> UVector b -> a
forall b a. Unbox b => (a -> b -> a) -> a -> Vector b -> a
UVector.foldl'
    }


instance Default UVectorModule where
  def :: UVectorModule
def = UVectorModule
forall interface. UVectorImplements interface => interface
_Data_Vector_Unboxed_