indexed-transformers-0.1.0.4: Atkey indexed monad transformers
Copyright(C) 2024 Eitan Chatav
LicenseBSD 3-Clause License (see the file LICENSE)
MaintainerEitan Chatav <eitan.chatav@gmail.com>
Safe HaskellSafe-Inferred
LanguageHaskell2010

Control.Monad.Trans.Indexed

Description

Indexed monad transformers.

Synopsis

Documentation

class (forall i j m. Monad m => Functor (t i j m), forall i j m. (i ~ j, Monad m) => Monad (t i j m), forall i j. i ~ j => MonadTrans (t i j)) => IxMonadTrans t where Source #

An Atkey indexed monad is a Functor enriched category. An indexed monad transformer transforms a Monad into an indexed monad. It is a monad and monad transformer when its source and target index are the same, enabling use of standard do notation in that case. In the general case, qualified Indexed.do notation can be used, even if the source and target index are different.

>>> :set -XQualifiedDo
>>> import qualified Control.Monad.Trans.Indexed.Do as Indexed

Minimal complete definition

joinIx | bindIx

Methods

apIx :: Monad m => t i j m (x -> y) -> t j k m x -> t i k m y Source #

indexed analog of <*>

(<*>) = apIx

joinIx :: Monad m => t i j m (t j k m y) -> t i k m y Source #

indexed analog of join

join = joinIx
joinIx = bindIx id

bindIx :: Monad m => (x -> t j k m y) -> t i j m x -> t i k m y Source #

indexed analog of =<<

(=<<) = bindIx
bindIx f x = joinIx (f <$> x)
x & bindIx return = x
x & bindIx f & bindIx g = x & bindIx (f & andThenIx g)

thenIx :: Monad m => t j k m y -> t i j m x -> t i k m y Source #

indexed analog of flipped >>

(>>) = flip thenIx
return () & thenIx y = y

andThenIx :: Monad m => (y -> t j k m z) -> (x -> t i j m y) -> x -> t i k m z Source #

indexed analog of <=<

(<=<) = andThenIx
andThenIx g f x = bindIx g (f x)
f & andThenIx return = f
return & andThenIx f = f
f & andThenIx g & andThenIx h = f & andThenIx (g & andThenIx h)

Instances

Instances details
IxMonadTrans StateIx Source # 
Instance details

Defined in Control.Monad.Trans.Indexed.State

Methods

apIx :: forall (m :: Type -> Type) (i :: k) (j :: k) x y (k1 :: k). Monad m => StateIx i j m (x -> y) -> StateIx j k1 m x -> StateIx i k1 m y Source #

joinIx :: forall (m :: Type -> Type) (i :: k) (j :: k) (k1 :: k) y. Monad m => StateIx i j m (StateIx j k1 m y) -> StateIx i k1 m y Source #

bindIx :: forall (m :: Type -> Type) x (j :: k) (k1 :: k) y (i :: k). Monad m => (x -> StateIx j k1 m y) -> StateIx i j m x -> StateIx i k1 m y Source #

thenIx :: forall (m :: Type -> Type) (j :: k) (k1 :: k) y (i :: k) x. Monad m => StateIx j k1 m y -> StateIx i j m x -> StateIx i k1 m y Source #

andThenIx :: forall (m :: Type -> Type) y (j :: k) (k1 :: k) z x (i :: k). Monad m => (y -> StateIx j k1 m z) -> (x -> StateIx i j m y) -> x -> StateIx i k1 m z Source #

IxMonadTrans (ContIx :: Type -> Type -> (Type -> Type) -> Type -> Type) Source # 
Instance details

Defined in Control.Monad.Trans.Indexed.Cont

Methods

apIx :: forall (m :: Type -> Type) (i :: k) (j :: k) x y (k1 :: k). Monad m => ContIx i j m (x -> y) -> ContIx j k1 m x -> ContIx i k1 m y Source #

joinIx :: forall (m :: Type -> Type) (i :: k) (j :: k) (k1 :: k) y. Monad m => ContIx i j m (ContIx j k1 m y) -> ContIx i k1 m y Source #

bindIx :: forall (m :: Type -> Type) x (j :: k) (k1 :: k) y (i :: k). Monad m => (x -> ContIx j k1 m y) -> ContIx i j m x -> ContIx i k1 m y Source #

thenIx :: forall (m :: Type -> Type) (j :: k) (k1 :: k) y (i :: k) x. Monad m => ContIx j k1 m y -> ContIx i j m x -> ContIx i k1 m y Source #

andThenIx :: forall (m :: Type -> Type) y (j :: k) (k1 :: k) z x (i :: k). Monad m => (y -> ContIx j k1 m z) -> (x -> ContIx i j m y) -> x -> ContIx i k1 m z Source #

IxFunctor f => IxMonadTrans (FreeIx f :: k -> k -> (Type -> Type) -> Type -> Type) Source # 
Instance details

Defined in Control.Monad.Trans.Indexed.Free.Fold

Methods

apIx :: forall (m :: Type -> Type) (i :: k0) (j :: k0) x y (k1 :: k0). Monad m => FreeIx f i j m (x -> y) -> FreeIx f j k1 m x -> FreeIx f i k1 m y Source #

joinIx :: forall (m :: Type -> Type) (i :: k0) (j :: k0) (k1 :: k0) y. Monad m => FreeIx f i j m (FreeIx f j k1 m y) -> FreeIx f i k1 m y Source #

bindIx :: forall (m :: Type -> Type) x (j :: k0) (k1 :: k0) y (i :: k0). Monad m => (x -> FreeIx f j k1 m y) -> FreeIx f i j m x -> FreeIx f i k1 m y Source #

thenIx :: forall (m :: Type -> Type) (j :: k0) (k1 :: k0) y (i :: k0) x. Monad m => FreeIx f j k1 m y -> FreeIx f i j m x -> FreeIx f i k1 m y Source #

andThenIx :: forall (m :: Type -> Type) y (j :: k0) (k1 :: k0) z x (i :: k0). Monad m => (y -> FreeIx f j k1 m z) -> (x -> FreeIx f i j m y) -> x -> FreeIx f i k1 m z Source #

IxFunctor f => IxMonadTrans (FreeIx f :: k -> k -> (Type -> Type) -> Type -> Type) Source # 
Instance details

Defined in Control.Monad.Trans.Indexed.Free.Wrap

Methods

apIx :: forall (m :: Type -> Type) (i :: k0) (j :: k0) x y (k1 :: k0). Monad m => FreeIx f i j m (x -> y) -> FreeIx f j k1 m x -> FreeIx f i k1 m y Source #

joinIx :: forall (m :: Type -> Type) (i :: k0) (j :: k0) (k1 :: k0) y. Monad m => FreeIx f i j m (FreeIx f j k1 m y) -> FreeIx f i k1 m y Source #

bindIx :: forall (m :: Type -> Type) x (j :: k0) (k1 :: k0) y (i :: k0). Monad m => (x -> FreeIx f j k1 m y) -> FreeIx f i j m x -> FreeIx f i k1 m y Source #

thenIx :: forall (m :: Type -> Type) (j :: k0) (k1 :: k0) y (i :: k0) x. Monad m => FreeIx f j k1 m y -> FreeIx f i j m x -> FreeIx f i k1 m y Source #

andThenIx :: forall (m :: Type -> Type) y (j :: k0) (k1 :: k0) z x (i :: k0). Monad m => (y -> FreeIx f j k1 m z) -> (x -> FreeIx f i j m y) -> x -> FreeIx f i k1 m z Source #

Category w => IxMonadTrans (WriterIx w :: k -> k -> (Type -> Type) -> Type -> Type) Source # 
Instance details

Defined in Control.Monad.Trans.Indexed.Writer

Methods

apIx :: forall (m :: Type -> Type) (i :: k0) (j :: k0) x y (k1 :: k0). Monad m => WriterIx w i j m (x -> y) -> WriterIx w j k1 m x -> WriterIx w i k1 m y Source #

joinIx :: forall (m :: Type -> Type) (i :: k0) (j :: k0) (k1 :: k0) y. Monad m => WriterIx w i j m (WriterIx w j k1 m y) -> WriterIx w i k1 m y Source #

bindIx :: forall (m :: Type -> Type) x (j :: k0) (k1 :: k0) y (i :: k0). Monad m => (x -> WriterIx w j k1 m y) -> WriterIx w i j m x -> WriterIx w i k1 m y Source #

thenIx :: forall (m :: Type -> Type) (j :: k0) (k1 :: k0) y (i :: k0) x. Monad m => WriterIx w j k1 m y -> WriterIx w i j m x -> WriterIx w i k1 m y Source #

andThenIx :: forall (m :: Type -> Type) y (j :: k0) (k1 :: k0) z x (i :: k0). Monad m => (y -> WriterIx w j k1 m z) -> (x -> WriterIx w i j m y) -> x -> WriterIx w i k1 m z Source #

newtype Indexed t m r i j Source #

Indexed reshuffles the type parameters of an IxMonadTrans, exposing its Category instance.

Constructors

Indexed 

Fields

Instances

Instances details
(IxMonadTrans t, Monad m, Monoid r) => Category (Indexed t m r :: k -> k -> Type) Source # 
Instance details

Defined in Control.Monad.Trans.Indexed

Methods

id :: forall (a :: k0). Indexed t m r a a #

(.) :: forall (b :: k0) (c :: k0) (a :: k0). Indexed t m r b c -> Indexed t m r a b -> Indexed t m r a c #

(&) :: a -> (a -> b) -> b infixl 1 #

& is a reverse application operator. This provides notational convenience. Its precedence is one higher than that of the forward application operator $, which allows & to be nested in $.

>>> 5 & (+1) & show
"6"

Since: base-4.8.0.0