{-# LANGUAGE NoImplicitPrelude, PolymorphicComponents #-}

-- | This module provides a first-class version
-- of the "Data.List" module.
module ModularPrelude.Module.List
  ( -- * Module interface
    ListModule (..)
    -- * Module contents
  , ListImplements (..)
  ) where


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


data ListModule = List
  { ListModule -> forall a b. (a -> b) -> [a] -> [b]
map         :: forall a b. (a -> b) -> [a] -> [b]
  , ListModule -> forall a b. (a -> [b]) -> [a] -> [b]
concatMap   :: forall a b. (a -> [b]) -> [a] -> [b]
  , ListModule -> forall a. (a -> Bool) -> [a] -> [a]
filter      :: forall a. (a -> Bool) -> [a] -> [a]
  , ListModule -> forall a. [a] -> Int
length      :: forall a. [a] -> Int
  , ListModule -> forall a. a -> [a]
singleton   :: forall a. a -> [a]
  , ListModule -> forall a. [a] -> Bool
null        :: forall a. [a] -> Bool
  , ListModule -> forall a. [a] -> [a]
pack        :: forall a. [a] -> [a]
  , ListModule -> forall a. [a] -> [a]
unpack      :: forall a. [a] -> [a]
  , ListModule -> forall a. [a] -> [a]
fromList    :: forall a. [a] -> [a]
  , ListModule -> forall a. [a] -> [a]
toList      :: forall a. [a] -> [a]
  , ListModule -> forall k a. Eq k => k -> [(k, a)] -> Maybe a
lookup      :: forall k a. Eq k => k -> [(k, a)] -> Maybe a
  , ListModule -> forall a. [a]
empty       :: forall a. [a]
  , ListModule -> forall a. a -> [a] -> [a]
insert      :: forall a. a -> [a] -> [a]
  , ListModule -> forall a. Eq a => a -> [a] -> [a]
delete      :: forall a. Eq a => a -> [a] -> [a]
  , ListModule -> forall a. Eq a => a -> [a] -> Bool
member      :: forall a. Eq a => a -> [a] -> Bool
  , ListModule -> forall a. Eq a => [a] -> [a] -> Maybe [a]
stripPrefix :: forall a. Eq a => [a] -> [a] -> Maybe [a]
  , ListModule -> forall a. (a -> Bool) -> [a] -> ([a], [a])
break       :: forall a. (a -> Bool) -> [a] -> ([a], [a])
  , ListModule -> forall a. (a -> Bool) -> [a] -> ([a], [a])
span        :: forall a. (a -> Bool) -> [a] -> ([a], [a])
  , ListModule -> forall a. (a -> Bool) -> [a] -> [a]
dropWhile   :: forall a. (a -> Bool) -> [a] -> [a]
  , ListModule -> forall a. (a -> Bool) -> [a] -> [a]
takeWhile   :: forall a. (a -> Bool) -> [a] -> [a]
  , ListModule -> forall a. (a -> Bool) -> [a] -> Bool
any         :: forall a. (a -> Bool) -> [a] -> Bool
  , ListModule -> forall a. (a -> Bool) -> [a] -> Bool
all         :: forall a. (a -> Bool) -> [a] -> Bool
  , ListModule -> forall a. Int -> [a] -> ([a], [a])
splitAt     :: forall a. Int -> [a] -> ([a], [a])
  , ListModule -> forall a b. (a -> b -> a) -> a -> [b] -> a
fold        :: forall a b. (a -> b -> a) -> a -> [b] -> a
  }


class ListImplements interface where
  _Data_List_ :: interface

instance ListImplements ListModule where
  _Data_List_ :: ListModule
_Data_List_ = List
    { map :: forall a b. (a -> b) -> [a] -> [b]
map         = (a -> b) -> [a] -> [b]
forall a b. (a -> b) -> [a] -> [b]
List.map
    , concatMap :: forall a b. (a -> [b]) -> [a] -> [b]
concatMap   = (a -> [b]) -> [a] -> [b]
forall a b. (a -> [b]) -> [a] -> [b]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
List.concatMap
    , filter :: forall a. (a -> Bool) -> [a] -> [a]
filter      = (a -> Bool) -> [a] -> [a]
forall a. (a -> Bool) -> [a] -> [a]
List.filter
    , length :: forall a. [a] -> Int
length      = [a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
List.length
    , singleton :: forall a. a -> [a]
singleton   = a -> [a]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return
    , null :: forall a. [a] -> Bool
null        = [a] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
List.null
    , pack :: forall a. [a] -> [a]
pack        = [a] -> [a]
forall a. a -> a
forall a. [a] -> [a]
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id
    , unpack :: forall a. [a] -> [a]
unpack      = [a] -> [a]
forall a. a -> a
forall a. [a] -> [a]
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id
    , fromList :: forall a. [a] -> [a]
fromList    = [a] -> [a]
forall a. a -> a
forall a. [a] -> [a]
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id
    , toList :: forall a. [a] -> [a]
toList      = [a] -> [a]
forall a. a -> a
forall a. [a] -> [a]
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id
    , lookup :: forall k a. Eq k => k -> [(k, a)] -> Maybe a
lookup      = k -> [(k, a)] -> Maybe a
forall k a. Eq k => k -> [(k, a)] -> Maybe a
List.lookup
    , empty :: forall a. [a]
empty       = []
    , insert :: forall a. a -> [a] -> [a]
insert      = (:) -- List.insert instead?
    , delete :: forall a. Eq a => a -> [a] -> [a]
delete      = a -> [a] -> [a]
forall a. Eq a => a -> [a] -> [a]
List.delete
    , member :: forall a. Eq a => a -> [a] -> Bool
member      = a -> [a] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
List.elem
    , stripPrefix :: forall a. Eq a => [a] -> [a] -> Maybe [a]
stripPrefix = [a] -> [a] -> Maybe [a]
forall a. Eq a => [a] -> [a] -> Maybe [a]
List.stripPrefix
    , break :: forall a. (a -> Bool) -> [a] -> ([a], [a])
break       = (a -> Bool) -> [a] -> ([a], [a])
forall a. (a -> Bool) -> [a] -> ([a], [a])
List.break
    , span :: forall a. (a -> Bool) -> [a] -> ([a], [a])
span        = (a -> Bool) -> [a] -> ([a], [a])
forall a. (a -> Bool) -> [a] -> ([a], [a])
List.span
    , dropWhile :: forall a. (a -> Bool) -> [a] -> [a]
dropWhile   = (a -> Bool) -> [a] -> [a]
forall a. (a -> Bool) -> [a] -> [a]
List.dropWhile
    , takeWhile :: forall a. (a -> Bool) -> [a] -> [a]
takeWhile   = (a -> Bool) -> [a] -> [a]
forall a. (a -> Bool) -> [a] -> [a]
List.takeWhile
    , any :: forall a. (a -> Bool) -> [a] -> Bool
any         = (a -> Bool) -> [a] -> Bool
forall a. (a -> Bool) -> [a] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
List.any
    , all :: forall a. (a -> Bool) -> [a] -> Bool
all         = (a -> Bool) -> [a] -> Bool
forall a. (a -> Bool) -> [a] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
List.all
    , splitAt :: forall a. Int -> [a] -> ([a], [a])
splitAt     = Int -> [a] -> ([a], [a])
forall a. Int -> [a] -> ([a], [a])
List.splitAt
    , fold :: forall a b. (a -> b -> a) -> a -> [b] -> a
fold        = (a -> b -> a) -> a -> [b] -> a
forall a b. (a -> b -> a) -> a -> [b] -> a
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl'
    }


instance Default ListModule where
  def :: ListModule
def = ListModule
forall interface. ListImplements interface => interface
_Data_List_