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