{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE MultiParamTypeClasses #-}

module Profunctor.Monad.MonadCoAction
  ( coAct
  , internaliseMaybe) where

import Data.Profunctor

-- | A right monad action on the contravariant parameter of a profunctor.
class (Profunctor p, Monad m) => MonadCoAction m p where
  coAct :: p u v -> p (m u) v

-- | 'coAct' with the Monad specialised to maybe as used in
--   "Composing Bidirectional Programs Monadically".
internaliseMaybe
  :: MonadCoAction Maybe p
  => p u v
  -> p (Maybe u) v
internaliseMaybe :: p u v -> p (Maybe u) v
internaliseMaybe = p u v -> p (Maybe u) v
forall (m :: * -> *) (p :: * -> * -> *) u v.
MonadCoAction m p =>
p u v -> p (m u) v
coAct