This package defines "freer indexed monad". It combines the ideas of freer monad and indexed (aka parameterized) monad:
Freer Monads, More Extensible Effects
Parameterized monads
Parameterized Extensible Effects and Session Types
It allows defining indexed monadic computations as GADTs without making
them into ad-hoc indexed monads, and instead use this data type
to convert them into Functor, XApplicative and XMonad instances
- see Control.XApplicative and Control.XMonad in this package.
This package does not (yet) allow composing these computations.
Semantically, these computations could represent type-level state changes
of some associated resources, with the first index parameter meaning
initial resource state prior to the computation, and the second index -
the final resource state, making each computation an edge in the graph
of resource state transitions.
For XApplicative/XMonad classes all class and additional functions have similar names
to standard Applicative/Monad functions, following two naming conventions:
function names are prefixed with "x" (for "indeXed") - e.g. xpure, xreturn, xliftM2 etc.
operators are postfixed with ":" - e.g. <*>:, >>=:, >=>: etc.