module Control.Applicative.Monoid (
MonoidApplicative(..), MonoidAlternative(..)
)
where
import Control.Applicative (Applicative (pure, (<*>)), Alternative ((<|>)), (<$>))
import Data.Monoid (Monoid, mempty)
import Data.Semigroup (Semigroup, (<>))
class Applicative f => MonoidApplicative f where
infixl 4 +<*>
(+<*>) :: f (a -> a) -> f a -> f a
(+<*>) = (<*>)
infixl 5 ><
(><) :: Semigroup a => f a -> f a -> f a
a >< b = (<>) <$> a +<*> b
class (Alternative f, MonoidApplicative f) => MonoidAlternative f where
moptional :: (Semigroup a, Monoid a) => f a -> f a
moptional x = x <|> pure mempty
concatMany :: (Semigroup a, Monoid a) => f a -> f a
concatMany x = many'
where many' = some' <|> pure mempty
some' = x >< many'
concatSome :: (Semigroup a, Monoid a) => f a -> f a
concatSome x = some'
where many' = some' <|> pure mempty
some' = x >< many'