packages feed

classy-prelude-0.4.4: ClassyPrelude/List.hs

{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
module ClassyPrelude.List () where

import qualified Prelude
import Prelude ((.), otherwise)
import ClassyPrelude.Classes
import qualified Data.List
import qualified Control.Monad

import Data.Monoid (Monoid)
import qualified Data.Monoid as Monoid
import qualified Data.Set as Set

instance CanMapFunc [a] [b] a b where
    mapFunc = Prelude.map
instance CanConcatMapFunc [a] [b] a [b] where
    concatMapFunc = Prelude.concatMap
instance CanFilterFunc [a] [a] a where
    filterFunc = Prelude.filter
instance CanFilterMFunc [a] a where
    filterMFunc = Control.Monad.filterM
instance CanLength [a] Prelude.Int where
    length = Prelude.length
instance CanSingleton [a] a where
    singleton = Prelude.return
instance CanNull [a] where
    null = Prelude.null
instance CanPack [a] a where
    pack = Prelude.id
    unpack = Prelude.id
    subsequences = Data.List.subsequences
    permutations = Data.List.permutations
instance CanIntersperse [a] a where
    intersperse = Data.List.intersperse
instance Prelude.Monad m => CanMapMFunc [i] (m [o]) m i o where
    mapMFunc = Prelude.mapM
instance CanMapM_Func [a] a where
    mapM_Func = Prelude.mapM_
instance Prelude.Eq k => CanLookup [(k, v)] k v where
    lookup = Prelude.lookup
instance Prelude.Eq k => CanInsertVal [(k, v)] k v where
    insertVal k v c = (k, v) : delete k c
instance Prelude.Eq k => CanDeleteVal [(k, v)] k where
    deleteVal k = filter ((Prelude./= k) . Prelude.fst)
instance Prelude.Eq x => CanMember [x] x where
    member x = Prelude.any (Prelude.== x)
instance Prelude.Eq a => CanStripPrefix [a] where
    stripPrefix = Data.List.stripPrefix
    isPrefixOf = Data.List.isPrefixOf
instance CanBreak [a] a where
    break = Prelude.break
    span = Prelude.span
    dropWhile = Prelude.dropWhile
    takeWhile = Prelude.takeWhile
instance CanAny [a] a where
    any = Prelude.any
    all = Prelude.all
instance CanSplitAt [c] Prelude.Int where
    splitAt = Prelude.splitAt
instance CanFoldFunc [a] a accum where
    foldFunc = Data.List.foldl'

instance (c ~ Prelude.Char) => CanWords [c] where
    words = Prelude.words
    unwords = Prelude.unwords

instance (c ~ Prelude.Char) => CanLinesFunc [c] where
    linesFunc = Prelude.lines

instance (c ~ Prelude.Char) => CanUnlines [c] where
    unlines = Prelude.unlines

instance Prelude.Eq a => CanIsInfixOf [a] where
    isInfixOf = Data.List.isInfixOf

instance CanReverse [a] where
    reverse = Prelude.reverse

instance CanReplicate [i] i Prelude.Int where
    replicate = Prelude.replicate

instance CanReplicateM [a] a Prelude.Int where
    replicateM = Control.Monad.replicateM

instance CanFind [a] a where
    find = Data.List.find

instance (Monoid m) => CanConcat [m] m where
    concat = Monoid.mconcat

instance CanPartition [a] a where
    partition = Data.List.partition

instance CanNubBy [a] a where
    nubBy = Data.List.nubBy

    nub =
        go Set.empty
      where
        go _ [] = []
        go set (x:xs)
            | x `Set.member` set = go set xs
            | otherwise = x : go (Set.insert x set) xs