{-# LANGUAGE CPP #-}
{-# LANGUAGE UndecidableInstances, TypeOperators, FlexibleContexts, MultiParamTypeClasses, FlexibleInstances, TypeFamilies #-}
#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 702 && __GLASGOW_HASKELL__ < 710
{-# LANGUAGE Trustworthy #-}
#endif
module Data.Generator.Combinators
(
mapM_
, forM_
, msum
, traverse_
, for_
, asum
, and
, or
, any
, all
, foldMap
, fold
, toList
, concatMap
, elem
, filter
, filterWith
, sum
, product
, notElem
) where
import Prelude hiding
( mapM_, any, all, elem, filter, concatMap, and, or
, sum, product, notElem, replicate, cycle, repeat
#if __GLASGOW_HASKELL__ >= 710
, foldMap
#endif
)
import Control.Applicative (Alternative)
import Control.Monad (MonadPlus)
import Data.Generator
import Data.Semigroup (Sum(..), Product(..), All(..), Any(..), WrappedMonoid(..))
import Data.Semigroup.Applicative (Traversal(..))
import Data.Semigroup.Alternative (Alternate(..))
import Data.Semigroup.Monad (Action(..))
import Data.Semigroup.MonadPlus (MonadSum(..))
import Data.Semigroup.Reducer (Reducer(..))
#if !(MIN_VERSION_base(4,8,0))
import Control.Applicative (Applicative)
import Data.Monoid (Monoid(..))
#endif
traverse_ :: (Generator c, Applicative f) => (Elem c -> f b) -> c -> f ()
traverse_ :: forall c (f :: * -> *) b.
(Generator c, Applicative f) =>
(Elem c -> f b) -> c -> f ()
traverse_ = forall c e m n.
(Generator c, Reducer e m, Monoid m) =>
(m -> n) -> (Elem c -> e) -> c -> n
mapReduceWith forall (f :: * -> *). Traversal f -> f ()
getTraversal
{-# INLINE traverse_ #-}
for_ :: (Generator c, Applicative f) => c -> (Elem c -> f b) -> f ()
for_ :: forall c (f :: * -> *) b.
(Generator c, Applicative f) =>
c -> (Elem c -> f b) -> f ()
for_ = forall a b c. (a -> b -> c) -> b -> a -> c
flip forall c (f :: * -> *) b.
(Generator c, Applicative f) =>
(Elem c -> f b) -> c -> f ()
traverse_
{-# INLINE for_ #-}
asum :: (Generator c, Alternative f, f a ~ Elem c) => c -> f a
asum :: forall c (f :: * -> *) a.
(Generator c, Alternative f, f a ~ Elem c) =>
c -> f a
asum = forall c m n.
(Generator c, Reducer (Elem c) m, Monoid m) =>
(m -> n) -> c -> n
reduceWith forall (f :: * -> *) a. Alternate f a -> f a
getAlternate
{-# INLINE asum #-}
mapM_ :: (Generator c, Monad m) => (Elem c -> m b) -> c -> m ()
mapM_ :: forall c (m :: * -> *) b.
(Generator c, Monad m) =>
(Elem c -> m b) -> c -> m ()
mapM_ = forall c e m n.
(Generator c, Reducer e m, Monoid m) =>
(m -> n) -> (Elem c -> e) -> c -> n
mapReduceWith forall (f :: * -> *). Action f -> f ()
getAction
{-# INLINE mapM_ #-}
forM_ :: (Generator c, Monad m) => c -> (Elem c -> m b) -> m ()
forM_ :: forall c (m :: * -> *) b.
(Generator c, Monad m) =>
c -> (Elem c -> m b) -> m ()
forM_ = forall a b c. (a -> b -> c) -> b -> a -> c
flip forall c (m :: * -> *) b.
(Generator c, Monad m) =>
(Elem c -> m b) -> c -> m ()
mapM_
{-# INLINE forM_ #-}
msum :: (Generator c, MonadPlus m, m a ~ Elem c) => c -> m a
msum :: forall c (m :: * -> *) a.
(Generator c, MonadPlus m, m a ~ Elem c) =>
c -> m a
msum = forall c m n.
(Generator c, Reducer (Elem c) m, Monoid m) =>
(m -> n) -> c -> n
reduceWith forall (f :: * -> *) a. MonadSum f a -> f a
getMonadSum
{-# INLINE msum #-}
foldMap :: (Monoid m, Generator c) => (Elem c -> m) -> c -> m
foldMap :: forall m c. (Monoid m, Generator c) => (Elem c -> m) -> c -> m
foldMap = forall c e m n.
(Generator c, Reducer e m, Monoid m) =>
(m -> n) -> (Elem c -> e) -> c -> n
mapReduceWith forall m. WrappedMonoid m -> m
unwrapMonoid
{-# INLINE foldMap #-}
concatMap :: Generator c => (Elem c -> [b]) -> c -> [b]
concatMap :: forall c b. Generator c => (Elem c -> [b]) -> c -> [b]
concatMap = forall m c. (Monoid m, Generator c) => (Elem c -> m) -> c -> m
foldMap
{-# INLINE concatMap #-}
fold :: (Monoid m, Generator c, Elem c ~ m) => c -> m
fold :: forall m c. (Monoid m, Generator c, Elem c ~ m) => c -> m
fold = forall c m n.
(Generator c, Reducer (Elem c) m, Monoid m) =>
(m -> n) -> c -> n
reduceWith forall m. WrappedMonoid m -> m
unwrapMonoid
{-# INLINE fold #-}
toList :: Generator c => c -> [Elem c]
toList :: forall c. Generator c => c -> [Elem c]
toList = forall c m. (Generator c, Reducer (Elem c) m, Monoid m) => c -> m
reduce
{-# INLINE toList #-}
and :: (Generator c, Elem c ~ Bool) => c -> Bool
and :: forall c. (Generator c, Elem c ~ Bool) => c -> Bool
and = forall c m n.
(Generator c, Reducer (Elem c) m, Monoid m) =>
(m -> n) -> c -> n
reduceWith All -> Bool
getAll
{-# INLINE and #-}
or :: (Generator c, Elem c ~ Bool) => c -> Bool
or :: forall c. (Generator c, Elem c ~ Bool) => c -> Bool
or = forall c m n.
(Generator c, Reducer (Elem c) m, Monoid m) =>
(m -> n) -> c -> n
reduceWith Any -> Bool
getAny
{-# INLINE or #-}
any :: Generator c => (Elem c -> Bool) -> c -> Bool
any :: forall c. Generator c => (Elem c -> Bool) -> c -> Bool
any = forall c e m n.
(Generator c, Reducer e m, Monoid m) =>
(m -> n) -> (Elem c -> e) -> c -> n
mapReduceWith Any -> Bool
getAny
{-# INLINE any #-}
all :: Generator c => (Elem c -> Bool) -> c -> Bool
all :: forall c. Generator c => (Elem c -> Bool) -> c -> Bool
all = forall c e m n.
(Generator c, Reducer e m, Monoid m) =>
(m -> n) -> (Elem c -> e) -> c -> n
mapReduceWith All -> Bool
getAll
{-# INLINE all #-}
sum :: (Generator c, Num (Elem c)) => c -> Elem c
sum :: forall c. (Generator c, Num (Elem c)) => c -> Elem c
sum = forall c m n.
(Generator c, Reducer (Elem c) m, Monoid m) =>
(m -> n) -> c -> n
reduceWith forall a. Sum a -> a
getSum
{-# INLINE sum #-}
product :: (Generator c, Num (Elem c)) => c -> Elem c
product :: forall c. (Generator c, Num (Elem c)) => c -> Elem c
product = forall c m n.
(Generator c, Reducer (Elem c) m, Monoid m) =>
(m -> n) -> c -> n
reduceWith forall a. Product a -> a
getProduct
{-# INLINE product #-}
elem :: (Generator c, Eq (Elem c)) => Elem c -> c -> Bool
elem :: forall c. (Generator c, Eq (Elem c)) => Elem c -> c -> Bool
elem = forall c. Generator c => (Elem c -> Bool) -> c -> Bool
any forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Eq a => a -> a -> Bool
(==)
{-# INLINE elem #-}
notElem :: (Generator c, Eq (Elem c)) => Elem c -> c -> Bool
notElem :: forall c. (Generator c, Eq (Elem c)) => Elem c -> c -> Bool
notElem Elem c
x = Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall c. (Generator c, Eq (Elem c)) => Elem c -> c -> Bool
elem Elem c
x
{-# INLINE notElem #-}
filter :: (Generator c, Reducer (Elem c) m, Monoid m) => (Elem c -> Bool) -> c -> m
filter :: forall c m.
(Generator c, Reducer (Elem c) m, Monoid m) =>
(Elem c -> Bool) -> c -> m
filter Elem c -> Bool
p = forall m c. (Monoid m, Generator c) => (Elem c -> m) -> c -> m
foldMap Elem c -> m
f where
f :: Elem c -> m
f Elem c
x | Elem c -> Bool
p Elem c
x = forall c m. Reducer c m => c -> m
unit Elem c
x
| Bool
otherwise = forall a. Monoid a => a
mempty
{-# INLINE filter #-}
filterWith :: (Generator c, Reducer (Elem c) m, Monoid m) => (m -> n) -> (Elem c -> Bool) -> c -> n
filterWith :: forall c m n.
(Generator c, Reducer (Elem c) m, Monoid m) =>
(m -> n) -> (Elem c -> Bool) -> c -> n
filterWith m -> n
f Elem c -> Bool
p = m -> n
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall c m.
(Generator c, Reducer (Elem c) m, Monoid m) =>
(Elem c -> Bool) -> c -> m
filter Elem c -> Bool
p
{-# INLINE filterWith #-}