-- | The indexed writer transformer: each @'WriterT' κ f@ term bears a morphism of @κ@ atop its argument, which are composed as the 'WriterT' terms are 'join'ed and @('<*>')@d.

module Control.Monad.Indexed.Trans.Writer where

import Prelude hiding ((.), id, (<*>), Monad (..))
import Control.Applicative (Alternative (..))
import qualified Control.Applicative as Base
import Control.Category (Category (id))
import Control.Semigroupoid (Semigroupoid (..))
import qualified Control.Monad as Base
import qualified Control.Monad.Fix as Base
import Control.Monad.Indexed.Signatures
import Data.Functor.Indexed

newtype WriterT κ f i j a = WriterT { WriterT κ f i j a -> f (a, κ i j)
runWriterT :: f (a, κ i j) }
  deriving (WriterT κ f i j a -> Bool
(a -> m) -> WriterT κ f i j a -> m
(a -> b -> b) -> b -> WriterT κ f i j a -> b
(forall m. Monoid m => WriterT κ f i j m -> m)
-> (forall m a. Monoid m => (a -> m) -> WriterT κ f i j a -> m)
-> (forall m a. Monoid m => (a -> m) -> WriterT κ f i j a -> m)
-> (forall a b. (a -> b -> b) -> b -> WriterT κ f i j a -> b)
-> (forall a b. (a -> b -> b) -> b -> WriterT κ f i j a -> b)
-> (forall b a. (b -> a -> b) -> b -> WriterT κ f i j a -> b)
-> (forall b a. (b -> a -> b) -> b -> WriterT κ f i j a -> b)
-> (forall a. (a -> a -> a) -> WriterT κ f i j a -> a)
-> (forall a. (a -> a -> a) -> WriterT κ f i j a -> a)
-> (forall a. WriterT κ f i j a -> [a])
-> (forall a. WriterT κ f i j a -> Bool)
-> (forall a. WriterT κ f i j a -> Int)
-> (forall a. Eq a => a -> WriterT κ f i j a -> Bool)
-> (forall a. Ord a => WriterT κ f i j a -> a)
-> (forall a. Ord a => WriterT κ f i j a -> a)
-> (forall a. Num a => WriterT κ f i j a -> a)
-> (forall a. Num a => WriterT κ f i j a -> a)
-> Foldable (WriterT κ f i j)
forall a. Eq a => a -> WriterT κ f i j a -> Bool
forall a. Num a => WriterT κ f i j a -> a
forall a. Ord a => WriterT κ f i j a -> a
forall m. Monoid m => WriterT κ f i j m -> m
forall a. WriterT κ f i j a -> Bool
forall a. WriterT κ f i j a -> Int
forall a. WriterT κ f i j a -> [a]
forall a. (a -> a -> a) -> WriterT κ f i j a -> a
forall m a. Monoid m => (a -> m) -> WriterT κ f i j a -> m
forall b a. (b -> a -> b) -> b -> WriterT κ f i j a -> b
forall a b. (a -> b -> b) -> b -> WriterT κ f i j a -> b
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
(Foldable f, Eq a) =>
a -> WriterT κ f i j a -> Bool
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
(Foldable f, Num a) =>
WriterT κ f i j a -> a
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
(Foldable f, Ord a) =>
WriterT κ f i j a -> a
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) m.
(Foldable f, Monoid m) =>
WriterT κ f i j m -> m
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
Foldable f =>
WriterT κ f i j a -> Bool
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
Foldable f =>
WriterT κ f i j a -> Int
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
Foldable f =>
WriterT κ f i j a -> [a]
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
Foldable f =>
(a -> a -> a) -> WriterT κ f i j a -> a
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) m a.
(Foldable f, Monoid m) =>
(a -> m) -> WriterT κ f i j a -> m
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) b a.
Foldable f =>
(b -> a -> b) -> b -> WriterT κ f i j a -> b
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a b.
Foldable f =>
(a -> b -> b) -> b -> WriterT κ f i j a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
product :: WriterT κ f i j a -> a
$cproduct :: forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
(Foldable f, Num a) =>
WriterT κ f i j a -> a
sum :: WriterT κ f i j a -> a
$csum :: forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
(Foldable f, Num a) =>
WriterT κ f i j a -> a
minimum :: WriterT κ f i j a -> a
$cminimum :: forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
(Foldable f, Ord a) =>
WriterT κ f i j a -> a
maximum :: WriterT κ f i j a -> a
$cmaximum :: forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
(Foldable f, Ord a) =>
WriterT κ f i j a -> a
elem :: a -> WriterT κ f i j a -> Bool
$celem :: forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
(Foldable f, Eq a) =>
a -> WriterT κ f i j a -> Bool
length :: WriterT κ f i j a -> Int
$clength :: forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
Foldable f =>
WriterT κ f i j a -> Int
null :: WriterT κ f i j a -> Bool
$cnull :: forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
Foldable f =>
WriterT κ f i j a -> Bool
toList :: WriterT κ f i j a -> [a]
$ctoList :: forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
Foldable f =>
WriterT κ f i j a -> [a]
foldl1 :: (a -> a -> a) -> WriterT κ f i j a -> a
$cfoldl1 :: forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
Foldable f =>
(a -> a -> a) -> WriterT κ f i j a -> a
foldr1 :: (a -> a -> a) -> WriterT κ f i j a -> a
$cfoldr1 :: forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
Foldable f =>
(a -> a -> a) -> WriterT κ f i j a -> a
foldl' :: (b -> a -> b) -> b -> WriterT κ f i j a -> b
$cfoldl' :: forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) b a.
Foldable f =>
(b -> a -> b) -> b -> WriterT κ f i j a -> b
foldl :: (b -> a -> b) -> b -> WriterT κ f i j a -> b
$cfoldl :: forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) b a.
Foldable f =>
(b -> a -> b) -> b -> WriterT κ f i j a -> b
foldr' :: (a -> b -> b) -> b -> WriterT κ f i j a -> b
$cfoldr' :: forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a b.
Foldable f =>
(a -> b -> b) -> b -> WriterT κ f i j a -> b
foldr :: (a -> b -> b) -> b -> WriterT κ f i j a -> b
$cfoldr :: forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a b.
Foldable f =>
(a -> b -> b) -> b -> WriterT κ f i j a -> b
foldMap' :: (a -> m) -> WriterT κ f i j a -> m
$cfoldMap' :: forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) m a.
(Foldable f, Monoid m) =>
(a -> m) -> WriterT κ f i j a -> m
foldMap :: (a -> m) -> WriterT κ f i j a -> m
$cfoldMap :: forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) m a.
(Foldable f, Monoid m) =>
(a -> m) -> WriterT κ f i j a -> m
fold :: WriterT κ f i j m -> m
$cfold :: forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) m.
(Foldable f, Monoid m) =>
WriterT κ f i j m -> m
Foldable, a -> WriterT κ f i j b -> WriterT κ f i j a
(a -> b) -> WriterT κ f i j a -> WriterT κ f i j b
(forall a b. (a -> b) -> WriterT κ f i j a -> WriterT κ f i j b)
-> (forall a b. a -> WriterT κ f i j b -> WriterT κ f i j a)
-> Functor (WriterT κ f i j)
forall a b. a -> WriterT κ f i j b -> WriterT κ f i j a
forall a b. (a -> b) -> WriterT κ f i j a -> WriterT κ f i j b
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a b.
Functor f =>
a -> WriterT κ f i j b -> WriterT κ f i j a
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a b.
Functor f =>
(a -> b) -> WriterT κ f i j a -> WriterT κ f i j b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> WriterT κ f i j b -> WriterT κ f i j a
$c<$ :: forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a b.
Functor f =>
a -> WriterT κ f i j b -> WriterT κ f i j a
fmap :: (a -> b) -> WriterT κ f i j a -> WriterT κ f i j b
$cfmap :: forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a b.
Functor f =>
(a -> b) -> WriterT κ f i j a -> WriterT κ f i j b
Functor, Functor (WriterT κ f i j)
Foldable (WriterT κ f i j)
(Functor (WriterT κ f i j), Foldable (WriterT κ f i j)) =>
(forall (f :: * -> *) a b.
 Applicative f =>
 (a -> f b) -> WriterT κ f i j a -> f (WriterT κ f i j b))
-> (forall (f :: * -> *) a.
    Applicative f =>
    WriterT κ f i j (f a) -> f (WriterT κ f i j a))
-> (forall (m :: * -> *) a b.
    Monad m =>
    (a -> m b) -> WriterT κ f i j a -> m (WriterT κ f i j b))
-> (forall (m :: * -> *) a.
    Monad m =>
    WriterT κ f i j (m a) -> m (WriterT κ f i j a))
-> Traversable (WriterT κ f i j)
(a -> f b) -> WriterT κ f i j a -> f (WriterT κ f i j b)
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k).
Traversable f =>
Functor (WriterT κ f i j)
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k).
Traversable f =>
Foldable (WriterT κ f i j)
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k)
       (m :: * -> *) a.
(Traversable f, Monad m) =>
WriterT κ f i j (m a) -> m (WriterT κ f i j a)
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k)
       (f :: * -> *) a.
(Traversable f, Applicative f) =>
WriterT κ f i j (f a) -> f (WriterT κ f i j a)
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k)
       (m :: * -> *) a b.
(Traversable f, Monad m) =>
(a -> m b) -> WriterT κ f i j a -> m (WriterT κ f i j b)
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k)
       (f :: * -> *) a b.
(Traversable f, Applicative f) =>
(a -> f b) -> WriterT κ f i j a -> f (WriterT κ f i j b)
forall (t :: * -> *).
(Functor t, Foldable t) =>
(forall (f :: * -> *) a b.
 Applicative f =>
 (a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
    Monad m =>
    (a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall (m :: * -> *) a.
Monad m =>
WriterT κ f i j (m a) -> m (WriterT κ f i j a)
forall (f :: * -> *) a.
Applicative f =>
WriterT κ f i j (f a) -> f (WriterT κ f i j a)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> WriterT κ f i j a -> m (WriterT κ f i j b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> WriterT κ f i j a -> f (WriterT κ f i j b)
sequence :: WriterT κ f i j (m a) -> m (WriterT κ f i j a)
$csequence :: forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k)
       (m :: * -> *) a.
(Traversable f, Monad m) =>
WriterT κ f i j (m a) -> m (WriterT κ f i j a)
mapM :: (a -> m b) -> WriterT κ f i j a -> m (WriterT κ f i j b)
$cmapM :: forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k)
       (m :: * -> *) a b.
(Traversable f, Monad m) =>
(a -> m b) -> WriterT κ f i j a -> m (WriterT κ f i j b)
sequenceA :: WriterT κ f i j (f a) -> f (WriterT κ f i j a)
$csequenceA :: forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k)
       (f :: * -> *) a.
(Traversable f, Applicative f) =>
WriterT κ f i j (f a) -> f (WriterT κ f i j a)
traverse :: (a -> f b) -> WriterT κ f i j a -> f (WriterT κ f i j b)
$ctraverse :: forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k)
       (f :: * -> *) a b.
(Traversable f, Applicative f) =>
(a -> f b) -> WriterT κ f i j a -> f (WriterT κ f i j b)
$cp2Traversable :: forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k).
Traversable f =>
Foldable (WriterT κ f i j)
$cp1Traversable :: forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k).
Traversable f =>
Functor (WriterT κ f i j)
Traversable)

lift :: (Functor f, Category κ) => f a -> WriterT κ f k k a
lift :: f a -> WriterT κ f k k a
lift xm :: f a
xm = f (a, κ k k) -> WriterT κ f k k a
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
f (a, κ i j) -> WriterT κ f i j a
WriterT (f (a, κ k k) -> WriterT κ f k k a)
-> f (a, κ k k) -> WriterT κ f k k a
forall a b. (a -> b) -> a -> b
$ (a -> κ k k -> (a, κ k k)) -> κ k k -> a -> (a, κ k k)
forall a b c. (a -> b -> c) -> b -> a -> c
flip (,) κ k k
forall k (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id (a -> (a, κ k k)) -> f a -> f (a, κ k k)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> f a
xm

mapWriterT :: (f (a, κ i j) -> f' (a', κ' i' j')) -> WriterT κ f i j a -> WriterT κ' f' i' j' a'
mapWriterT :: (f (a, κ i j) -> f' (a', κ' i' j'))
-> WriterT κ f i j a -> WriterT κ' f' i' j' a'
mapWriterT f :: f (a, κ i j) -> f' (a', κ' i' j')
f = f' (a', κ' i' j') -> WriterT κ' f' i' j' a'
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
f (a, κ i j) -> WriterT κ f i j a
WriterT (f' (a', κ' i' j') -> WriterT κ' f' i' j' a')
-> (WriterT κ f i j a -> f' (a', κ' i' j'))
-> WriterT κ f i j a
-> WriterT κ' f' i' j' a'
forall k (κ :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Semigroupoid κ =>
κ b c -> κ a b -> κ a c
. f (a, κ i j) -> f' (a', κ' i' j')
f (f (a, κ i j) -> f' (a', κ' i' j'))
-> (WriterT κ f i j a -> f (a, κ i j))
-> WriterT κ f i j a
-> f' (a', κ' i' j')
forall k (κ :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Semigroupoid κ =>
κ b c -> κ a b -> κ a c
. WriterT κ f i j a -> f (a, κ i j)
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
WriterT κ f i j a -> f (a, κ i j)
runWriterT

tell :: Applicative p => κ i j -> WriterT κ p i j ()
tell :: κ i j -> WriterT κ p i j ()
tell = p ((), κ i j) -> WriterT κ p i j ()
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
f (a, κ i j) -> WriterT κ f i j a
WriterT (p ((), κ i j) -> WriterT κ p i j ())
-> (κ i j -> p ((), κ i j)) -> κ i j -> WriterT κ p i j ()
forall k (κ :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Semigroupoid κ =>
κ b c -> κ a b -> κ a c
. ((), κ i j) -> p ((), κ i j)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (((), κ i j) -> p ((), κ i j))
-> (κ i j -> ((), κ i j)) -> κ i j -> p ((), κ i j)
forall k (κ :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Semigroupoid κ =>
κ b c -> κ a b -> κ a c
. (,) ()

listen :: Functor f => WriterT κ f i j a -> WriterT κ f i j (a, κ i j)
listen :: WriterT κ f i j a -> WriterT κ f i j (a, κ i j)
listen = (f (a, κ i j) -> f ((a, κ i j), κ i j))
-> WriterT κ f i j a -> WriterT κ f i j (a, κ i j)
forall k k k k (f :: * -> *) a (κ :: k -> k -> *) (i :: k) (j :: k)
       (f' :: * -> *) a' (κ' :: k -> k -> *) (i' :: k) (j' :: k).
(f (a, κ i j) -> f' (a', κ' i' j'))
-> WriterT κ f i j a -> WriterT κ' f' i' j' a'
mapWriterT ((f (a, κ i j) -> f ((a, κ i j), κ i j))
 -> WriterT κ f i j a -> WriterT κ f i j (a, κ i j))
-> (((a, κ i j) -> ((a, κ i j), κ i j))
    -> f (a, κ i j) -> f ((a, κ i j), κ i j))
-> ((a, κ i j) -> ((a, κ i j), κ i j))
-> WriterT κ f i j a
-> WriterT κ f i j (a, κ i j)
forall k (κ :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Semigroupoid κ =>
κ b c -> κ a b -> κ a c
. ((a, κ i j) -> ((a, κ i j), κ i j))
-> f (a, κ i j) -> f ((a, κ i j), κ i j)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (((a, κ i j) -> ((a, κ i j), κ i j))
 -> WriterT κ f i j a -> WriterT κ f i j (a, κ i j))
-> ((a, κ i j) -> ((a, κ i j), κ i j))
-> WriterT κ f i j a
-> WriterT κ f i j (a, κ i j)
forall a b. (a -> b) -> a -> b
$ \ (a :: a
a, v :: κ i j
v) -> ((a
a, κ i j
v), κ i j
v)

pass :: Functor f => WriterT κ f i j (a, κ i j -> κ i j) -> WriterT κ f i j a
pass :: WriterT κ f i j (a, κ i j -> κ i j) -> WriterT κ f i j a
pass = (f ((a, κ i j -> κ i j), κ i j) -> f (a, κ i j))
-> WriterT κ f i j (a, κ i j -> κ i j) -> WriterT κ f i j a
forall k k k k (f :: * -> *) a (κ :: k -> k -> *) (i :: k) (j :: k)
       (f' :: * -> *) a' (κ' :: k -> k -> *) (i' :: k) (j' :: k).
(f (a, κ i j) -> f' (a', κ' i' j'))
-> WriterT κ f i j a -> WriterT κ' f' i' j' a'
mapWriterT ((f ((a, κ i j -> κ i j), κ i j) -> f (a, κ i j))
 -> WriterT κ f i j (a, κ i j -> κ i j) -> WriterT κ f i j a)
-> ((((a, κ i j -> κ i j), κ i j) -> (a, κ i j))
    -> f ((a, κ i j -> κ i j), κ i j) -> f (a, κ i j))
-> (((a, κ i j -> κ i j), κ i j) -> (a, κ i j))
-> WriterT κ f i j (a, κ i j -> κ i j)
-> WriterT κ f i j a
forall k (κ :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Semigroupoid κ =>
κ b c -> κ a b -> κ a c
. (((a, κ i j -> κ i j), κ i j) -> (a, κ i j))
-> f ((a, κ i j -> κ i j), κ i j) -> f (a, κ i j)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((((a, κ i j -> κ i j), κ i j) -> (a, κ i j))
 -> WriterT κ f i j (a, κ i j -> κ i j) -> WriterT κ f i j a)
-> (((a, κ i j -> κ i j), κ i j) -> (a, κ i j))
-> WriterT κ f i j (a, κ i j -> κ i j)
-> WriterT κ f i j a
forall a b. (a -> b) -> a -> b
$ \ ((a :: a
a, f :: κ i j -> κ i j
f), v :: κ i j
v) -> (a
a, κ i j -> κ i j
f κ i j
v)

censor :: Functor f => (κ i j -> κ' i' j') -> WriterT κ f i j a -> WriterT κ' f i' j' a
censor :: (κ i j -> κ' i' j') -> WriterT κ f i j a -> WriterT κ' f i' j' a
censor = (f (a, κ i j) -> f (a, κ' i' j'))
-> WriterT κ f i j a -> WriterT κ' f i' j' a
forall k k k k (f :: * -> *) a (κ :: k -> k -> *) (i :: k) (j :: k)
       (f' :: * -> *) a' (κ' :: k -> k -> *) (i' :: k) (j' :: k).
(f (a, κ i j) -> f' (a', κ' i' j'))
-> WriterT κ f i j a -> WriterT κ' f' i' j' a'
mapWriterT ((f (a, κ i j) -> f (a, κ' i' j'))
 -> WriterT κ f i j a -> WriterT κ' f i' j' a)
-> ((κ i j -> κ' i' j') -> f (a, κ i j) -> f (a, κ' i' j'))
-> (κ i j -> κ' i' j')
-> WriterT κ f i j a
-> WriterT κ' f i' j' a
forall k (κ :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Semigroupoid κ =>
κ b c -> κ a b -> κ a c
. ((a, κ i j) -> (a, κ' i' j')) -> f (a, κ i j) -> f (a, κ' i' j')
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (((a, κ i j) -> (a, κ' i' j')) -> f (a, κ i j) -> f (a, κ' i' j'))
-> ((κ i j -> κ' i' j') -> (a, κ i j) -> (a, κ' i' j'))
-> (κ i j -> κ' i' j')
-> f (a, κ i j)
-> f (a, κ' i' j')
forall k (κ :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Semigroupoid κ =>
κ b c -> κ a b -> κ a c
. (κ i j -> κ' i' j') -> (a, κ i j) -> (a, κ' i' j')
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap

instance (Base.Applicative p, Category κ) => Base.Applicative (WriterT κ p k k) where
    pure :: a -> WriterT κ p k k a
pure = p a -> WriterT κ p k k a
forall k (f :: * -> *) (κ :: k -> k -> *) a (k :: k).
(Functor f, Category κ) =>
f a -> WriterT κ f k k a
lift (p a -> WriterT κ p k k a) -> (a -> p a) -> a -> WriterT κ p k k a
forall k (κ :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Semigroupoid κ =>
κ b c -> κ a b -> κ a c
. a -> p a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
    <*> :: WriterT κ p k k (a -> b) -> WriterT κ p k k a -> WriterT κ p k k b
(<*>) = WriterT κ p k k (a -> b) -> WriterT κ p k k a -> WriterT κ p k k b
forall k (p :: k -> k -> * -> *) (i :: k) (j :: k) a b (k :: k).
Apply p =>
p i j (a -> b) -> p j k a -> p i k b
(<*>)

instance (Base.Monad m, Category κ) => Base.Monad (WriterT κ m k k) where
    >>= :: WriterT κ m k k a -> (a -> WriterT κ m k k b) -> WriterT κ m k k b
(>>=) = WriterT κ m k k a -> (a -> WriterT κ m k k b) -> WriterT κ m k k b
forall k (m :: k -> k -> * -> *) (i :: k) (j :: k) a (k :: k) b.
Bind m =>
m i j a -> (a -> m j k b) -> m i k b
(>>=)

instance (Semigroupoid κ, Base.Applicative p) => Apply (WriterT κ p) where
    WriterT x :: p (a -> b, κ i j)
x <*> :: WriterT κ p i j (a -> b) -> WriterT κ p j k a -> WriterT κ p i k b
<*> WriterT y :: p (a, κ j k)
y = p (b, κ i k) -> WriterT κ p i k b
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
f (a, κ i j) -> WriterT κ f i j a
WriterT (p (b, κ i k) -> WriterT κ p i k b)
-> p (b, κ i k) -> WriterT κ p i k b
forall a b. (a -> b) -> a -> b
$ (\ (f :: a -> b
f, u :: κ i j
u) (a :: a
a, v :: κ j k
v) -> (a -> b
f a
a, κ j k
v κ j k -> κ i j -> κ i k
forall k (κ :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Semigroupoid κ =>
κ b c -> κ a b -> κ a c
. κ i j
u)) ((a -> b, κ i j) -> (a, κ j k) -> (b, κ i k))
-> p (a -> b, κ i j) -> p ((a, κ j k) -> (b, κ i k))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p (a -> b, κ i j)
x p ((a, κ j k) -> (b, κ i k)) -> p (a, κ j k) -> p (b, κ i k)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Base.<*> p (a, κ j k)
y

instance (Semigroupoid κ, Base.Monad m) => Bind (WriterT κ m) where
    join :: WriterT κ m i j (WriterT κ m j k a) -> WriterT κ m i k a
join (WriterT x :: m (WriterT κ m j k a, κ i j)
x) = m (a, κ i k) -> WriterT κ m i k a
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
f (a, κ i j) -> WriterT κ f i j a
WriterT [(a
b, κ j k
v κ j k -> κ i j -> κ i k
forall k (κ :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Semigroupoid κ =>
κ b c -> κ a b -> κ a c
. κ i j
u) | (WriterT y :: m (a, κ j k)
y, u :: κ i j
u) <- m (WriterT κ m j k a, κ i j)
x, (b :: a
b, v :: κ j k
v) <- m (a, κ j k)
y]

instance (Alternative p, Category κ) => Alternative (WriterT κ p k k) where
    empty :: WriterT κ p k k a
empty = p (a, κ k k) -> WriterT κ p k k a
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
f (a, κ i j) -> WriterT κ f i j a
WriterT p (a, κ k k)
forall (f :: * -> *) a. Alternative f => f a
empty
    WriterT x :: p (a, κ k k)
x <|> :: WriterT κ p k k a -> WriterT κ p k k a -> WriterT κ p k k a
<|> WriterT y :: p (a, κ k k)
y = p (a, κ k k) -> WriterT κ p k k a
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
f (a, κ i j) -> WriterT κ f i j a
WriterT (p (a, κ k k)
x p (a, κ k k) -> p (a, κ k k) -> p (a, κ k k)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> p (a, κ k k)
y)

instance (Base.MonadPlus p, Category κ) => Base.MonadPlus (WriterT κ p k k)

instance (Base.MonadFix m, Category κ) => Base.MonadFix (WriterT κ m k k) where
    mfix :: (a -> WriterT κ m k k a) -> WriterT κ m k k a
mfix f :: a -> WriterT κ m k k a
f = m (a, κ k k) -> WriterT κ m k k a
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
f (a, κ i j) -> WriterT κ f i j a
WriterT (m (a, κ k k) -> WriterT κ m k k a)
-> m (a, κ k k) -> WriterT κ m k k a
forall a b. (a -> b) -> a -> b
$ ((a, κ k k) -> m (a, κ k k)) -> m (a, κ k k)
forall (m :: * -> *) a. MonadFix m => (a -> m a) -> m a
Base.mfix (\ (a :: a
a, u :: κ k k
u) -> (\ (b :: a
b, v :: κ k k
v) -> (a
b, κ k k
v κ k k -> κ k k -> κ k k
forall k (κ :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Semigroupoid κ =>
κ b c -> κ a b -> κ a c
. κ k k
u)) ((a, κ k k) -> (a, κ k k)) -> m (a, κ k k) -> m (a, κ k k)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> WriterT κ m k k a -> m (a, κ k k)
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
WriterT κ f i j a -> f (a, κ i j)
runWriterT (a -> WriterT κ m k k a
f a
a))

liftCallCC
 :: Category κ
 => CallCC f g h (a, κ k k) (b, κ i₁ j₁) (c, κ i₂ j₂) (d, κ i₃ j₃) -> CallCC (WriterT κ f i₁ j₁) (WriterT κ g i₂ j₂) (WriterT κ h i₃ j₃) a b c d
liftCallCC :: CallCC f g h (a, κ k k) (b, κ i₁ j₁) (c, κ i₂ j₂) (d, κ i₃ j₃)
-> CallCC
     (WriterT κ f i₁ j₁) (WriterT κ g i₂ j₂) (WriterT κ h i₃ j₃) a b c d
liftCallCC callCC :: CallCC f g h (a, κ k k) (b, κ i₁ j₁) (c, κ i₂ j₂) (d, κ i₃ j₃)
callCC f :: (a -> WriterT κ f i₁ j₁ b) -> WriterT κ g i₂ j₂ c
f = h (d, κ i₃ j₃) -> WriterT κ h i₃ j₃ d
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
f (a, κ i j) -> WriterT κ f i j a
WriterT (h (d, κ i₃ j₃) -> WriterT κ h i₃ j₃ d)
-> h (d, κ i₃ j₃) -> WriterT κ h i₃ j₃ d
forall a b. (a -> b) -> a -> b
$ CallCC f g h (a, κ k k) (b, κ i₁ j₁) (c, κ i₂ j₂) (d, κ i₃ j₃)
callCC CallCC f g h (a, κ k k) (b, κ i₁ j₁) (c, κ i₂ j₂) (d, κ i₃ j₃)
-> CallCC f g h (a, κ k k) (b, κ i₁ j₁) (c, κ i₂ j₂) (d, κ i₃ j₃)
forall a b. (a -> b) -> a -> b
$ \ k :: (a, κ k k) -> f (b, κ i₁ j₁)
k -> WriterT κ g i₂ j₂ c -> g (c, κ i₂ j₂)
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
WriterT κ f i j a -> f (a, κ i j)
runWriterT (WriterT κ g i₂ j₂ c -> g (c, κ i₂ j₂))
-> WriterT κ g i₂ j₂ c -> g (c, κ i₂ j₂)
forall a b. (a -> b) -> a -> b
$ (a -> WriterT κ f i₁ j₁ b) -> WriterT κ g i₂ j₂ c
f ((a -> WriterT κ f i₁ j₁ b) -> WriterT κ g i₂ j₂ c)
-> (a -> WriterT κ f i₁ j₁ b) -> WriterT κ g i₂ j₂ c
forall a b. (a -> b) -> a -> b
$ \ a :: a
a -> f (b, κ i₁ j₁) -> WriterT κ f i₁ j₁ b
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
f (a, κ i j) -> WriterT κ f i j a
WriterT (f (b, κ i₁ j₁) -> WriterT κ f i₁ j₁ b)
-> f (b, κ i₁ j₁) -> WriterT κ f i₁ j₁ b
forall a b. (a -> b) -> a -> b
$ (a, κ k k) -> f (b, κ i₁ j₁)
k (a
a, κ k k
forall k (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id)

liftCatch
 :: Catch e f g h (a, κ i₁ j₁) (b, κ i₂ j₂) (c, κ i₃ j₃)
 -> Catch e (WriterT κ f i₁ j₁) (WriterT κ g i₂ j₂) (WriterT κ h i₃ j₃) a b c
liftCatch :: Catch e f g h (a, κ i₁ j₁) (b, κ i₂ j₂) (c, κ i₃ j₃)
-> Catch
     e (WriterT κ f i₁ j₁) (WriterT κ g i₂ j₂) (WriterT κ h i₃ j₃) a b c
liftCatch catchE :: Catch e f g h (a, κ i₁ j₁) (b, κ i₂ j₂) (c, κ i₃ j₃)
catchE (WriterT xm :: f (a, κ i₁ j₁)
xm) h :: e -> WriterT κ g i₂ j₂ b
h = h (c, κ i₃ j₃) -> WriterT κ h i₃ j₃ c
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
f (a, κ i j) -> WriterT κ f i j a
WriterT (h (c, κ i₃ j₃) -> WriterT κ h i₃ j₃ c)
-> h (c, κ i₃ j₃) -> WriterT κ h i₃ j₃ c
forall a b. (a -> b) -> a -> b
$ Catch e f g h (a, κ i₁ j₁) (b, κ i₂ j₂) (c, κ i₃ j₃)
catchE f (a, κ i₁ j₁)
xm ((e -> g (b, κ i₂ j₂)) -> h (c, κ i₃ j₃))
-> (e -> g (b, κ i₂ j₂)) -> h (c, κ i₃ j₃)
forall a b. (a -> b) -> a -> b
$ WriterT κ g i₂ j₂ b -> g (b, κ i₂ j₂)
forall k k (κ :: k -> k -> *) (f :: * -> *) (i :: k) (j :: k) a.
WriterT κ f i j a -> f (a, κ i j)
runWriterT (WriterT κ g i₂ j₂ b -> g (b, κ i₂ j₂))
-> (e -> WriterT κ g i₂ j₂ b) -> e -> g (b, κ i₂ j₂)
forall k (κ :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Semigroupoid κ =>
κ b c -> κ a b -> κ a c
. e -> WriterT κ g i₂ j₂ b
h