    {-# LANGUAGE Trustworthy #-}
    {-# LANGUAGE NoImplicitPrelude #-}

    -----------------------------------------------------------------------------
    -- |
    -- Module      :  Data.List
    -- Copyright   :  (c) The University of Glasgow 2001
    -- License     :  BSD-style (see the file libraries/base/LICENSE)
    --
    -- Maintainer  :  libraries@haskell.org
    -- Stability   :  stable
    -- Portability :  portable
    --
    -- Operations on lists.
    --
    -----------------------------------------------------------------------------

    module Data.List
       (
       -- * Basic functions

         (++)
       , head
       , last
       , tail
       , init
       , uncons
       , null
       , length

       -- * List transformations
       , map
       , reverse

       , intersperse
       , intercalate
       , transpose

       , subsequences
       , permutations

       -- * Reducing lists (folds)

       , foldl
       , foldl'
       , foldl1
       , foldl1'
       , foldr
       , foldr1

       -- ** Special folds

       , concat
       , concatMap
       , and
       , or
       , any
       , all
       , sum
       , product
       , maximum
       , minimum

       -- * Building lists

       -- ** Scans
       , scanl
       , scanl'
       , scanl1
       , scanr
       , scanr1

       -- ** Accumulating maps
       , mapAccumL
       , mapAccumR

       -- ** Infinite lists
       , iterate
       , repeat
       , replicate
       , cycle

       -- ** Unfolding
       , unfoldr

       -- * Sublists

       -- ** Extracting sublists
       , take
       , drop
       , splitAt

       , takeWhile
       , dropWhile
       , dropWhileEnd
       , span
       , break

       , stripPrefix

       , group

       , inits
       , tails

       -- ** Predicates
       , isPrefixOf
       , isSuffixOf
       , isInfixOf
       , isSubsequenceOf

       -- * Searching lists

       -- ** Searching by equality
       , elem
       , notElem
       , lookup

       -- ** Searching with a predicate
       , find
       , filter
       , partition

       -- * Indexing lists
       -- | These functions treat a list @xs@ as a indexed collection,
       -- with indices ranging from 0 to @'length' xs - 1@.

       , (!!)

       , elemIndex
       , elemIndices

       , findIndex
       , findIndices

       -- * Zipping and unzipping lists

       , zip
       , zip3
       , zip4, zip5, zip6, zip7

       , zipWith
       , zipWith3
       , zipWith4, zipWith5, zipWith6, zipWith7

       , unzip
       , unzip3
       , unzip4, unzip5, unzip6, unzip7

       -- * Special lists

       -- ** Functions on strings
       , lines
       , words
       , unlines
       , unwords

       -- ** \"Set\" operations

       , nub

       , delete
       , (\\)

       , union
       , intersect

       -- ** Ordered lists
       , sort
       , sortOn
       , insert

       -- * Generalized functions

       -- ** The \"@By@\" operations
       -- | By convention, overloaded functions have a non-overloaded
       -- counterpart whose name is suffixed with \`@By@\'.
       --
       -- It is often convenient to use these functions together with
       -- 'Data.Function.on', for instance @'sortBy' ('compare'
       -- \`on\` 'fst')@.

       -- *** User-supplied equality (replacing an @Eq@ context)
       -- | The predicate is assumed to define an equivalence.
       , nubBy
       , deleteBy
       , deleteFirstsBy
       , unionBy
       , intersectBy
       , groupBy

       -- *** User-supplied comparison (replacing an @Ord@ context)
       -- | The function is assumed to define a total ordering.
       , sortBy
       , insertBy
       , maximumBy
       , minimumBy

       -- ** The \"@generic@\" operations
       -- | The prefix \`@generic@\' indicates an overloaded function that
       -- is a generalized version of a "Prelude" function.

       , genericLength
       , genericTake
       , genericDrop
       , genericSplitAt
       , genericIndex
       , genericReplicate

       ) where

    import Data.Foldable
    import Data.Traversable

    import Data.OldList hiding ( all, and, any, concat, concatMap, elem, find,
                                 foldl, foldl1, foldl', foldr, foldr1, mapAccumL,
                                 mapAccumR, maximum, maximumBy, minimum, minimumBy,
                                 length, notElem, null, or, product, sum )

    import GHC.Base ( Bool(..), Eq((==)), otherwise )

    -- | The 'isSubsequenceOf' function takes two lists and returns 'True' if the
    -- first list is a subsequence of the second list.
    --
    -- @'isSubsequenceOf' x y@ is equivalent to @'elem' x ('subsequences' y)@.
    --
    -- @since 4.8.0.0
    --
    -- ==== __Examples__
    --
    -- >>> isSubsequenceOf "GHC" "The Glorious Haskell Compiler"
    -- True
    -- >>> isSubsequenceOf ['a','d'..'z'] ['a'..'z']
    -- True
    -- >>> isSubsequenceOf [1..10] [10,9..0]
    -- False
    isSubsequenceOf :: (Eq a) => [a] -> [a] -> Bool
    isSubsequenceOf []    _                    = True
    isSubsequenceOf _     []                   = False
    isSubsequenceOf a@(x:a') (y:b) | x == y    = isSubsequenceOf a' b
                                   | otherwise = isSubsequenceOf a b