module Hextra.Monad.MonadPlus where

import Control.Monad

newtype MonoidPlus f a = MonoidPlus (f a)

instance MonadPlus f => Semigroup (MonoidPlus f a) where
    (MonoidPlus f a
x) <> :: MonoidPlus f a -> MonoidPlus f a -> MonoidPlus f a
<> (MonoidPlus f a
y) = f a -> MonoidPlus f a
forall (f :: * -> *) a. f a -> MonoidPlus f a
MonoidPlus (f a -> MonoidPlus f a) -> f a -> MonoidPlus f a
forall a b. (a -> b) -> a -> b
$ f a -> f a -> f a
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
mplus f a
x f a
y

instance MonadPlus f => Monoid (MonoidPlus f a) where
    mempty :: MonoidPlus f a
mempty = f a -> MonoidPlus f a
forall (f :: * -> *) a. f a -> MonoidPlus f a
MonoidPlus f a
forall (m :: * -> *) a. MonadPlus m => m a
mzero
    mappend :: MonoidPlus f a -> MonoidPlus f a -> MonoidPlus f a
mappend (MonoidPlus f a
x) (MonoidPlus f a
y) = f a -> MonoidPlus f a
forall (f :: * -> *) a. f a -> MonoidPlus f a
MonoidPlus (f a -> MonoidPlus f a) -> f a -> MonoidPlus f a
forall a b. (a -> b) -> a -> b
$ f a -> f a -> f a
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
mplus f a
x f a
y