    {-# LANGUAGE FlexibleInstances #-}
    {-# LANGUAGE MultiParamTypeClasses #-}
    {-# LANGUAGE UndecidableInstances #-}

    {-# OPTIONS_GHC -Wno-orphans #-}

    module Data.Monoid.Extra where

    import Control.Monad.State (MonadState(..))
    import Data.Monoid (Ap(Ap))

    instance (MonadState s m) => MonadState s (Ap m) where
      get :: Ap m s
    get = m s -> Ap m s
    forall {k} (f :: k -> Type) (a :: k). f a -> Ap f a
    Ap m s
    forall s (m :: Type -> Type). MonadState s m => m s
    get
      put :: s -> Ap m ()
    put = m () -> Ap m ()
    forall {k} (f :: k -> Type) (a :: k). f a -> Ap f a
    Ap (m () -> Ap m ()) -> (s -> m ()) -> s -> Ap m ()
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . s -> m ()
    forall s (m :: Type -> Type). MonadState s m => s -> m ()
    put
      state :: forall a. (s -> (a, s)) -> Ap m a
    state = m a -> Ap m a
    forall {k} (f :: k -> Type) (a :: k). f a -> Ap f a
    Ap (m a -> Ap m a)
    -> ((s -> (a, s)) -> m a) -> (s -> (a, s)) -> Ap m a
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . (s -> (a, s)) -> m a
    forall a. (s -> (a, s)) -> m a
    forall s (m :: Type -> Type) a.
    MonadState s m =>
    (s -> (a, s)) -> m a
    state