module Data.Monoid.MonadicEndo where
import Data.Monoid (Monoid, mempty, )
import Data.Semigroup (Semigroup, (<>), )
newtype T m a = Cons {forall (m :: * -> *) a. T m a -> a -> m a
run :: a -> m a}
instance Monad m => Semigroup (T m a) where
Cons a -> m a
x <> :: T m a -> T m a -> T m a
<> Cons a -> m a
y =
(a -> m a) -> T m a
forall (m :: * -> *) a. (a -> m a) -> T m a
Cons ((a -> m a) -> T m a) -> (a -> m a) -> T m a
forall a b. (a -> b) -> a -> b
$ (a -> m a
x (a -> m a) -> m a -> m a
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (m a -> m a) -> (a -> m a) -> a -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> m a
y
instance Monad m => Monoid (T m a) where
mempty :: T m a
mempty = (a -> m a) -> T m a
forall (m :: * -> *) a. (a -> m a) -> T m a
Cons a -> m a
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return