{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneKindSignatures #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeInType #-}
{-# LANGUAGE UnboxedTuples #-}
{-# LANGUAGE UndecidableInstances #-}

-- |
-- Description : Typeclass for implicit 'EventBackend' passing
-- Copyright   : Copyright 2022 Shea Levy.
-- License     : Apache-2.0
-- Maintainer  : shea@shealevy.com
--
-- Core typeclass for an mtl-style handling of 'EventBackend's.
-- See "Observe.Event.Explicit" for an explicit, function-based
-- interface.
module Observe.Event.Class
  ( MonadEvent (..),
    EnvBackend,
    TransEventMonad (..),

    -- * EventT
    EventT (..),
    runEventT,
    eventLift,

    -- * Kind aliases
    EventMonadKind,
    ReferenceKind,
    SelectorKind,
    FunctorKind,
  )
where

import Control.Applicative
import Control.Monad
import Control.Monad.Allocate
import Control.Monad.Base
import Control.Monad.Catch
import Control.Monad.Cont.Class
import Control.Monad.Error.Class
import Control.Monad.Fix
import Control.Monad.IO.Unlift
import Control.Monad.Primitive
import Control.Monad.Reader
import Control.Monad.State.Class
import Control.Monad.Trans.Control
import Control.Monad.With
import Control.Monad.Writer.Class
import Control.Monad.Zip
import Control.Natural.Control
import Data.Coerce
import Data.Functor
import Data.Functor.Contravariant
import Data.GeneralAllocate
import Data.Kind
import Observe.Event.Backend

-- | Monads suitable for 'Event'-based instrumentation, with implicit 'EventBackend' management.
--
-- See "Observe.Event.Explicit" for 'Event'-based instrumentation with explicit 'EventBackend'
-- passing.
--
-- Note that @em@ is an indexed monad of 'EventMonadKind'.
type MonadEvent :: EventMonadKind -> Constraint
class (forall r s. Monad (em r s), Monad (BackendMonad em)) => MonadEvent em where
  -- | The monad of the implicitly carried 'EventBackend'
  type BackendMonad em :: Type -> Type

  -- |
  liftBackendMonad :: BackendMonad em a -> em r s a

  -- | Access the implicitly carried 'EventBackend'
  backend :: em r s (EnvBackend em r s)

  -- | Run an instrumented action with a modified 'EventBackend'
  withModifiedBackend ::
    -- | Modify the 'EventBackend'
    --
    -- Note that the modification may change
    -- the reference and selector types.
    (EnvBackend em r s -> EnvBackend em r' s') ->
    -- | Action to run with the modified backend available.
    em r' s' a ->
    em r s a

-- | The type of the implicit 'EventBackend' of a 'MonadEvent'
type EnvBackend :: EventMonadKind -> ReferenceKind -> SelectorKind -> Type
type EnvBackend em = EventBackend (BackendMonad em)

-- | Make a monad into a 'MonadEvent'.
newtype EventT m r s a = EventT (ReaderT (EventBackend m r s) m a)
  deriving newtype
    ( forall (a :: ReferenceKind) (b :: ReferenceKind).
a -> EventT m r s b -> EventT m r s a
forall (a :: ReferenceKind) (b :: ReferenceKind).
(a -> b) -> EventT m r s a -> EventT m r s b
forall (f :: SelectorKind).
(forall (a :: ReferenceKind) (b :: ReferenceKind).
 (a -> b) -> f a -> f b)
-> (forall (a :: ReferenceKind) (b :: ReferenceKind).
    a -> f b -> f a)
-> Functor f
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind) (b :: ReferenceKind).
Functor m =>
a -> EventT m r s b -> EventT m r s a
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind) (b :: ReferenceKind).
Functor m =>
(a -> b) -> EventT m r s a -> EventT m r s b
<$ :: forall (a :: ReferenceKind) (b :: ReferenceKind).
a -> EventT m r s b -> EventT m r s a
$c<$ :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind) (b :: ReferenceKind).
Functor m =>
a -> EventT m r s b -> EventT m r s a
fmap :: forall (a :: ReferenceKind) (b :: ReferenceKind).
(a -> b) -> EventT m r s a -> EventT m r s b
$cfmap :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind) (b :: ReferenceKind).
Functor m =>
(a -> b) -> EventT m r s a -> EventT m r s b
Functor,
      forall (a :: ReferenceKind). a -> EventT m r s a
forall (a :: ReferenceKind) (b :: ReferenceKind).
EventT m r s a -> EventT m r s b -> EventT m r s a
forall (a :: ReferenceKind) (b :: ReferenceKind).
EventT m r s a -> EventT m r s b -> EventT m r s b
forall (a :: ReferenceKind) (b :: ReferenceKind).
EventT m r s (a -> b) -> EventT m r s a -> EventT m r s b
forall (a :: ReferenceKind) (b :: ReferenceKind)
       (c :: ReferenceKind).
(a -> b -> c) -> EventT m r s a -> EventT m r s b -> EventT m r s c
forall (f :: SelectorKind).
Functor f
-> (forall (a :: ReferenceKind). a -> f a)
-> (forall (a :: ReferenceKind) (b :: ReferenceKind).
    f (a -> b) -> f a -> f b)
-> (forall (a :: ReferenceKind) (b :: ReferenceKind)
           (c :: ReferenceKind).
    (a -> b -> c) -> f a -> f b -> f c)
-> (forall (a :: ReferenceKind) (b :: ReferenceKind).
    f a -> f b -> f b)
-> (forall (a :: ReferenceKind) (b :: ReferenceKind).
    f a -> f b -> f a)
-> Applicative f
forall {m :: SelectorKind} {r :: ReferenceKind}
       {s :: SelectorKind}.
Applicative m =>
Functor (EventT m r s)
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind).
Applicative m =>
a -> EventT m r s a
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind) (b :: ReferenceKind).
Applicative m =>
EventT m r s a -> EventT m r s b -> EventT m r s a
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind) (b :: ReferenceKind).
Applicative m =>
EventT m r s a -> EventT m r s b -> EventT m r s b
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind) (b :: ReferenceKind).
Applicative m =>
EventT m r s (a -> b) -> EventT m r s a -> EventT m r s b
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind) (b :: ReferenceKind) (c :: ReferenceKind).
Applicative m =>
(a -> b -> c) -> EventT m r s a -> EventT m r s b -> EventT m r s c
<* :: forall (a :: ReferenceKind) (b :: ReferenceKind).
EventT m r s a -> EventT m r s b -> EventT m r s a
$c<* :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind) (b :: ReferenceKind).
Applicative m =>
EventT m r s a -> EventT m r s b -> EventT m r s a
*> :: forall (a :: ReferenceKind) (b :: ReferenceKind).
EventT m r s a -> EventT m r s b -> EventT m r s b
$c*> :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind) (b :: ReferenceKind).
Applicative m =>
EventT m r s a -> EventT m r s b -> EventT m r s b
liftA2 :: forall (a :: ReferenceKind) (b :: ReferenceKind)
       (c :: ReferenceKind).
(a -> b -> c) -> EventT m r s a -> EventT m r s b -> EventT m r s c
$cliftA2 :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind) (b :: ReferenceKind) (c :: ReferenceKind).
Applicative m =>
(a -> b -> c) -> EventT m r s a -> EventT m r s b -> EventT m r s c
<*> :: forall (a :: ReferenceKind) (b :: ReferenceKind).
EventT m r s (a -> b) -> EventT m r s a -> EventT m r s b
$c<*> :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind) (b :: ReferenceKind).
Applicative m =>
EventT m r s (a -> b) -> EventT m r s a -> EventT m r s b
pure :: forall (a :: ReferenceKind). a -> EventT m r s a
$cpure :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind).
Applicative m =>
a -> EventT m r s a
Applicative,
      forall (a :: ReferenceKind). a -> EventT m r s a
forall (a :: ReferenceKind) (b :: ReferenceKind).
EventT m r s a -> EventT m r s b -> EventT m r s b
forall (a :: ReferenceKind) (b :: ReferenceKind).
EventT m r s a -> (a -> EventT m r s b) -> EventT m r s b
forall (m :: SelectorKind).
Applicative m
-> (forall (a :: ReferenceKind) (b :: ReferenceKind).
    m a -> (a -> m b) -> m b)
-> (forall (a :: ReferenceKind) (b :: ReferenceKind).
    m a -> m b -> m b)
-> (forall (a :: ReferenceKind). a -> m a)
-> Monad m
forall {m :: SelectorKind} {r :: ReferenceKind}
       {s :: SelectorKind}.
Monad m =>
Applicative (EventT m r s)
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind).
Monad m =>
a -> EventT m r s a
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind) (b :: ReferenceKind).
Monad m =>
EventT m r s a -> EventT m r s b -> EventT m r s b
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind) (b :: ReferenceKind).
Monad m =>
EventT m r s a -> (a -> EventT m r s b) -> EventT m r s b
return :: forall (a :: ReferenceKind). a -> EventT m r s a
$creturn :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind).
Monad m =>
a -> EventT m r s a
>> :: forall (a :: ReferenceKind) (b :: ReferenceKind).
EventT m r s a -> EventT m r s b -> EventT m r s b
$c>> :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind) (b :: ReferenceKind).
Monad m =>
EventT m r s a -> EventT m r s b -> EventT m r s b
>>= :: forall (a :: ReferenceKind) (b :: ReferenceKind).
EventT m r s a -> (a -> EventT m r s b) -> EventT m r s b
$c>>= :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind) (b :: ReferenceKind).
Monad m =>
EventT m r s a -> (a -> EventT m r s b) -> EventT m r s b
Monad,
      MonadError e,
      MonadState s',
      MonadWriter w,
      forall (a :: ReferenceKind). String -> EventT m r s a
forall (m :: SelectorKind).
Monad m
-> (forall (a :: ReferenceKind). String -> m a) -> MonadFail m
forall {m :: SelectorKind} {r :: ReferenceKind}
       {s :: SelectorKind}.
MonadFail m =>
Monad (EventT m r s)
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind).
MonadFail m =>
String -> EventT m r s a
fail :: forall (a :: ReferenceKind). String -> EventT m r s a
$cfail :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind).
MonadFail m =>
String -> EventT m r s a
MonadFail,
      forall (a :: ReferenceKind).
(a -> EventT m r s a) -> EventT m r s a
forall (m :: SelectorKind).
Monad m
-> (forall (a :: ReferenceKind). (a -> m a) -> m a) -> MonadFix m
forall {m :: SelectorKind} {r :: ReferenceKind}
       {s :: SelectorKind}.
MonadFix m =>
Monad (EventT m r s)
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind).
MonadFix m =>
(a -> EventT m r s a) -> EventT m r s a
mfix :: forall (a :: ReferenceKind).
(a -> EventT m r s a) -> EventT m r s a
$cmfix :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind).
MonadFix m =>
(a -> EventT m r s a) -> EventT m r s a
MonadFix,
      forall (a :: ReferenceKind). IO a -> EventT m r s a
forall (m :: SelectorKind).
Monad m -> (forall (a :: ReferenceKind). IO a -> m a) -> MonadIO m
forall {m :: SelectorKind} {r :: ReferenceKind}
       {s :: SelectorKind}.
MonadIO m =>
Monad (EventT m r s)
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind).
MonadIO m =>
IO a -> EventT m r s a
liftIO :: forall (a :: ReferenceKind). IO a -> EventT m r s a
$cliftIO :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind).
MonadIO m =>
IO a -> EventT m r s a
MonadIO,
      forall (a :: ReferenceKind) (b :: ReferenceKind).
EventT m r s a -> EventT m r s b -> EventT m r s (a, b)
forall (a :: ReferenceKind) (b :: ReferenceKind).
EventT m r s (a, b) -> (EventT m r s a, EventT m r s b)
forall (a :: ReferenceKind) (b :: ReferenceKind)
       (c :: ReferenceKind).
(a -> b -> c) -> EventT m r s a -> EventT m r s b -> EventT m r s c
forall (m :: SelectorKind).
Monad m
-> (forall (a :: ReferenceKind) (b :: ReferenceKind).
    m a -> m b -> m (a, b))
-> (forall (a :: ReferenceKind) (b :: ReferenceKind)
           (c :: ReferenceKind).
    (a -> b -> c) -> m a -> m b -> m c)
-> (forall (a :: ReferenceKind) (b :: ReferenceKind).
    m (a, b) -> (m a, m b))
-> MonadZip m
forall {m :: SelectorKind} {r :: ReferenceKind}
       {s :: SelectorKind}.
MonadZip m =>
Monad (EventT m r s)
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind) (b :: ReferenceKind).
MonadZip m =>
EventT m r s a -> EventT m r s b -> EventT m r s (a, b)
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind) (b :: ReferenceKind).
MonadZip m =>
EventT m r s (a, b) -> (EventT m r s a, EventT m r s b)
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind) (b :: ReferenceKind) (c :: ReferenceKind).
MonadZip m =>
(a -> b -> c) -> EventT m r s a -> EventT m r s b -> EventT m r s c
munzip :: forall (a :: ReferenceKind) (b :: ReferenceKind).
EventT m r s (a, b) -> (EventT m r s a, EventT m r s b)
$cmunzip :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind) (b :: ReferenceKind).
MonadZip m =>
EventT m r s (a, b) -> (EventT m r s a, EventT m r s b)
mzipWith :: forall (a :: ReferenceKind) (b :: ReferenceKind)
       (c :: ReferenceKind).
(a -> b -> c) -> EventT m r s a -> EventT m r s b -> EventT m r s c
$cmzipWith :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind) (b :: ReferenceKind) (c :: ReferenceKind).
MonadZip m =>
(a -> b -> c) -> EventT m r s a -> EventT m r s b -> EventT m r s c
mzip :: forall (a :: ReferenceKind) (b :: ReferenceKind).
EventT m r s a -> EventT m r s b -> EventT m r s (a, b)
$cmzip :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind) (b :: ReferenceKind).
MonadZip m =>
EventT m r s a -> EventT m r s b -> EventT m r s (a, b)
MonadZip,
      forall (b :: ReferenceKind) (a :: ReferenceKind).
b -> EventT m r s b -> EventT m r s a
forall (a' :: ReferenceKind) (a :: ReferenceKind).
(a' -> a) -> EventT m r s a -> EventT m r s a'
forall (f :: SelectorKind).
(forall (a' :: ReferenceKind) (a :: ReferenceKind).
 (a' -> a) -> f a -> f a')
-> (forall (b :: ReferenceKind) (a :: ReferenceKind).
    b -> f b -> f a)
-> Contravariant f
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (b :: ReferenceKind) (a :: ReferenceKind).
Contravariant m =>
b -> EventT m r s b -> EventT m r s a
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a' :: ReferenceKind) (a :: ReferenceKind).
Contravariant m =>
(a' -> a) -> EventT m r s a -> EventT m r s a'
>$ :: forall (b :: ReferenceKind) (a :: ReferenceKind).
b -> EventT m r s b -> EventT m r s a
$c>$ :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (b :: ReferenceKind) (a :: ReferenceKind).
Contravariant m =>
b -> EventT m r s b -> EventT m r s a
contramap :: forall (a' :: ReferenceKind) (a :: ReferenceKind).
(a' -> a) -> EventT m r s a -> EventT m r s a'
$ccontramap :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a' :: ReferenceKind) (a :: ReferenceKind).
Contravariant m =>
(a' -> a) -> EventT m r s a -> EventT m r s a'
Contravariant,
      forall (a :: ReferenceKind). EventT m r s a
forall (a :: ReferenceKind). EventT m r s a -> EventT m r s [a]
forall (a :: ReferenceKind).
EventT m r s a -> EventT m r s a -> EventT m r s a
forall (f :: SelectorKind).
Applicative f
-> (forall (a :: ReferenceKind). f a)
-> (forall (a :: ReferenceKind). f a -> f a -> f a)
-> (forall (a :: ReferenceKind). f a -> f [a])
-> (forall (a :: ReferenceKind). f a -> f [a])
-> Alternative f
forall {m :: SelectorKind} {r :: ReferenceKind}
       {s :: SelectorKind}.
Alternative m =>
Applicative (EventT m r s)
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind).
Alternative m =>
EventT m r s a
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind).
Alternative m =>
EventT m r s a -> EventT m r s [a]
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind).
Alternative m =>
EventT m r s a -> EventT m r s a -> EventT m r s a
many :: forall (a :: ReferenceKind). EventT m r s a -> EventT m r s [a]
$cmany :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind).
Alternative m =>
EventT m r s a -> EventT m r s [a]
some :: forall (a :: ReferenceKind). EventT m r s a -> EventT m r s [a]
$csome :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind).
Alternative m =>
EventT m r s a -> EventT m r s [a]
<|> :: forall (a :: ReferenceKind).
EventT m r s a -> EventT m r s a -> EventT m r s a
$c<|> :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind).
Alternative m =>
EventT m r s a -> EventT m r s a -> EventT m r s a
empty :: forall (a :: ReferenceKind). EventT m r s a
$cempty :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind).
Alternative m =>
EventT m r s a
Alternative,
      forall (a :: ReferenceKind). EventT m r s a
forall (a :: ReferenceKind).
EventT m r s a -> EventT m r s a -> EventT m r s a
forall (m :: SelectorKind).
Alternative m
-> Monad m
-> (forall (a :: ReferenceKind). m a)
-> (forall (a :: ReferenceKind). m a -> m a -> m a)
-> MonadPlus m
forall {m :: SelectorKind} {r :: ReferenceKind}
       {s :: SelectorKind}.
MonadPlus m =>
Monad (EventT m r s)
forall {m :: SelectorKind} {r :: ReferenceKind}
       {s :: SelectorKind}.
MonadPlus m =>
Alternative (EventT m r s)
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind).
MonadPlus m =>
EventT m r s a
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind).
MonadPlus m =>
EventT m r s a -> EventT m r s a -> EventT m r s a
mplus :: forall (a :: ReferenceKind).
EventT m r s a -> EventT m r s a -> EventT m r s a
$cmplus :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind).
MonadPlus m =>
EventT m r s a -> EventT m r s a -> EventT m r s a
mzero :: forall (a :: ReferenceKind). EventT m r s a
$cmzero :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind).
MonadPlus m =>
EventT m r s a
MonadPlus,
      forall (a :: ReferenceKind) (b :: ReferenceKind).
((a -> EventT m r s b) -> EventT m r s a) -> EventT m r s a
forall (m :: SelectorKind).
Monad m
-> (forall (a :: ReferenceKind) (b :: ReferenceKind).
    ((a -> m b) -> m a) -> m a)
-> MonadCont m
forall {m :: SelectorKind} {r :: ReferenceKind}
       {s :: SelectorKind}.
MonadCont m =>
Monad (EventT m r s)
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind) (b :: ReferenceKind).
MonadCont m =>
((a -> EventT m r s b) -> EventT m r s a) -> EventT m r s a
callCC :: forall (a :: ReferenceKind) (b :: ReferenceKind).
((a -> EventT m r s b) -> EventT m r s a) -> EventT m r s a
$ccallCC :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind) (b :: ReferenceKind).
MonadCont m =>
((a -> EventT m r s b) -> EventT m r s a) -> EventT m r s a
MonadCont,
      forall (b :: ReferenceKind).
((forall (a :: ReferenceKind). EventT m r s a -> IO a) -> IO b)
-> EventT m r s b
forall (m :: SelectorKind).
MonadIO m
-> (forall (b :: ReferenceKind).
    ((forall (a :: ReferenceKind). m a -> IO a) -> IO b) -> m b)
-> MonadUnliftIO m
forall {m :: SelectorKind} {r :: ReferenceKind}
       {s :: SelectorKind}.
MonadUnliftIO m =>
MonadIO (EventT m r s)
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (b :: ReferenceKind).
MonadUnliftIO m =>
((forall (a :: ReferenceKind). EventT m r s a -> IO a) -> IO b)
-> EventT m r s b
withRunInIO :: forall (b :: ReferenceKind).
((forall (a :: ReferenceKind). EventT m r s a -> IO a) -> IO b)
-> EventT m r s b
$cwithRunInIO :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (b :: ReferenceKind).
MonadUnliftIO m =>
((forall (a :: ReferenceKind). EventT m r s a -> IO a) -> IO b)
-> EventT m r s b
MonadUnliftIO,
      MonadBase b,
      MonadBaseControl b,
      GeneralReleaseKey (EventT m r s)
-> AllocationContext (EventT m r s) ()
(GeneralReleaseType (AllocationException (EventT m r s)) ()
 -> AllocationContext (EventT m r s) ())
-> EventT m r s (GeneralReleaseKey (EventT m r s))
forall (a :: ReferenceKind).
GeneralAllocate
  (AllocationContext (EventT m r s))
  (AllocationException (EventT m r s))
  ()
  ()
  a
-> EventT m r s (GeneralReleaseKey (EventT m r s), a)
forall (m :: SelectorKind).
Monad m
-> Monad (AllocationContext m)
-> (forall (a :: ReferenceKind).
    GeneralAllocate
      (AllocationContext m) (AllocationException m) () () a
    -> m (GeneralReleaseKey m, a))
-> ((GeneralReleaseType (AllocationException m) ()
     -> AllocationContext m ())
    -> m (GeneralReleaseKey m))
-> (GeneralReleaseKey m -> AllocationContext m ())
-> MonadAllocate m
forall {m :: SelectorKind} {r :: ReferenceKind}
       {s :: SelectorKind}.
MonadAllocate m =>
Monad (AllocationContext (EventT m r s))
forall {m :: SelectorKind} {r :: ReferenceKind}
       {s :: SelectorKind}.
MonadAllocate m =>
Monad (EventT m r s)
forall (m :: SelectorKind) (r :: ReferenceKind)
       (s :: SelectorKind).
MonadAllocate m =>
GeneralReleaseKey (EventT m r s)
-> AllocationContext (EventT m r s) ()
forall (m :: SelectorKind) (r :: ReferenceKind)
       (s :: SelectorKind).
MonadAllocate m =>
(GeneralReleaseType (AllocationException (EventT m r s)) ()
 -> AllocationContext (EventT m r s) ())
-> EventT m r s (GeneralReleaseKey (EventT m r s))
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind).
MonadAllocate m =>
GeneralAllocate
  (AllocationContext (EventT m r s))
  (AllocationException (EventT m r s))
  ()
  ()
  a
-> EventT m r s (GeneralReleaseKey (EventT m r s), a)
generalRelease :: GeneralReleaseKey (EventT m r s)
-> AllocationContext (EventT m r s) ()
$cgeneralRelease :: forall (m :: SelectorKind) (r :: ReferenceKind)
       (s :: SelectorKind).
MonadAllocate m =>
GeneralReleaseKey (EventT m r s)
-> AllocationContext (EventT m r s) ()
generalRegister :: (GeneralReleaseType (AllocationException (EventT m r s)) ()
 -> AllocationContext (EventT m r s) ())
-> EventT m r s (GeneralReleaseKey (EventT m r s))
$cgeneralRegister :: forall (m :: SelectorKind) (r :: ReferenceKind)
       (s :: SelectorKind).
MonadAllocate m =>
(GeneralReleaseType (AllocationException (EventT m r s)) ()
 -> AllocationContext (EventT m r s) ())
-> EventT m r s (GeneralReleaseKey (EventT m r s))
generalAllocate :: forall (a :: ReferenceKind).
GeneralAllocate
  (AllocationContext (EventT m r s))
  (AllocationException (EventT m r s))
  ()
  ()
  a
-> EventT m r s (GeneralReleaseKey (EventT m r s), a)
$cgeneralAllocate :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind).
MonadAllocate m =>
GeneralAllocate
  (AllocationContext (EventT m r s))
  (AllocationException (EventT m r s))
  ()
  ()
  a
-> EventT m r s (GeneralReleaseKey (EventT m r s), a)
MonadAllocate,
      forall (e :: ReferenceKind) (a :: ReferenceKind).
Exception e =>
EventT m r s a -> (e -> EventT m r s a) -> EventT m r s a
forall (m :: SelectorKind).
MonadThrow m
-> (forall (e :: ReferenceKind) (a :: ReferenceKind).
    Exception e =>
    m a -> (e -> m a) -> m a)
-> MonadCatch m
forall {m :: SelectorKind} {r :: ReferenceKind}
       {s :: SelectorKind}.
MonadCatch m =>
MonadThrow (EventT m r s)
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (e :: ReferenceKind) (a :: ReferenceKind).
(MonadCatch m, Exception e) =>
EventT m r s a -> (e -> EventT m r s a) -> EventT m r s a
catch :: forall (e :: ReferenceKind) (a :: ReferenceKind).
Exception e =>
EventT m r s a -> (e -> EventT m r s a) -> EventT m r s a
$ccatch :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (e :: ReferenceKind) (a :: ReferenceKind).
(MonadCatch m, Exception e) =>
EventT m r s a -> (e -> EventT m r s a) -> EventT m r s a
MonadCatch,
      forall (e :: ReferenceKind) (a :: ReferenceKind).
Exception e =>
e -> EventT m r s a
forall (m :: SelectorKind).
Monad m
-> (forall (e :: ReferenceKind) (a :: ReferenceKind).
    Exception e =>
    e -> m a)
-> MonadThrow m
forall {m :: SelectorKind} {r :: ReferenceKind}
       {s :: SelectorKind}.
MonadThrow m =>
Monad (EventT m r s)
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (e :: ReferenceKind) (a :: ReferenceKind).
(MonadThrow m, Exception e) =>
e -> EventT m r s a
throwM :: forall (e :: ReferenceKind) (a :: ReferenceKind).
Exception e =>
e -> EventT m r s a
$cthrowM :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (e :: ReferenceKind) (a :: ReferenceKind).
(MonadThrow m, Exception e) =>
e -> EventT m r s a
MonadThrow,
      forall (b :: ReferenceKind).
((forall (a :: ReferenceKind). EventT m r s a -> EventT m r s a)
 -> EventT m r s b)
-> EventT m r s b
forall (a :: ReferenceKind) (b :: ReferenceKind)
       (c :: ReferenceKind).
EventT m r s a
-> (a -> ExitCase b -> EventT m r s c)
-> (a -> EventT m r s b)
-> EventT m r s (b, c)
forall (m :: SelectorKind).
MonadCatch m
-> (forall (b :: ReferenceKind).
    ((forall (a :: ReferenceKind). m a -> m a) -> m b) -> m b)
-> (forall (b :: ReferenceKind).
    ((forall (a :: ReferenceKind). m a -> m a) -> m b) -> m b)
-> (forall (a :: ReferenceKind) (b :: ReferenceKind)
           (c :: ReferenceKind).
    m a -> (a -> ExitCase b -> m c) -> (a -> m b) -> m (b, c))
-> MonadMask m
forall {m :: SelectorKind} {r :: ReferenceKind}
       {s :: SelectorKind}.
MonadMask m =>
MonadCatch (EventT m r s)
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (b :: ReferenceKind).
MonadMask m =>
((forall (a :: ReferenceKind). EventT m r s a -> EventT m r s a)
 -> EventT m r s b)
-> EventT m r s b
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind) (b :: ReferenceKind) (c :: ReferenceKind).
MonadMask m =>
EventT m r s a
-> (a -> ExitCase b -> EventT m r s c)
-> (a -> EventT m r s b)
-> EventT m r s (b, c)
generalBracket :: forall (a :: ReferenceKind) (b :: ReferenceKind)
       (c :: ReferenceKind).
EventT m r s a
-> (a -> ExitCase b -> EventT m r s c)
-> (a -> EventT m r s b)
-> EventT m r s (b, c)
$cgeneralBracket :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind) (b :: ReferenceKind) (c :: ReferenceKind).
MonadMask m =>
EventT m r s a
-> (a -> ExitCase b -> EventT m r s c)
-> (a -> EventT m r s b)
-> EventT m r s (b, c)
uninterruptibleMask :: forall (b :: ReferenceKind).
((forall (a :: ReferenceKind). EventT m r s a -> EventT m r s a)
 -> EventT m r s b)
-> EventT m r s b
$cuninterruptibleMask :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (b :: ReferenceKind).
MonadMask m =>
((forall (a :: ReferenceKind). EventT m r s a -> EventT m r s a)
 -> EventT m r s b)
-> EventT m r s b
mask :: forall (b :: ReferenceKind).
((forall (a :: ReferenceKind). EventT m r s a -> EventT m r s a)
 -> EventT m r s b)
-> EventT m r s b
$cmask :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (b :: ReferenceKind).
MonadMask m =>
((forall (a :: ReferenceKind). EventT m r s a -> EventT m r s a)
 -> EventT m r s b)
-> EventT m r s b
MonadMask,
      forall (a :: ReferenceKind).
(State# (PrimState (EventT m r s))
 -> (# State# (PrimState (EventT m r s)), a #))
-> EventT m r s a
forall (m :: SelectorKind).
Monad m
-> (forall (a :: ReferenceKind).
    (State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a)
-> PrimMonad m
forall {m :: SelectorKind} {r :: ReferenceKind}
       {s :: SelectorKind}.
PrimMonad m =>
Monad (EventT m r s)
forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind).
PrimMonad m =>
(State# (PrimState (EventT m r s))
 -> (# State# (PrimState (EventT m r s)), a #))
-> EventT m r s a
primitive :: forall (a :: ReferenceKind).
(State# (PrimState (EventT m r s))
 -> (# State# (PrimState (EventT m r s)), a #))
-> EventT m r s a
$cprimitive :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind).
PrimMonad m =>
(State# (PrimState (EventT m r s))
 -> (# State# (PrimState (EventT m r s)), a #))
-> EventT m r s a
PrimMonad
    )

-- | Run an 'EventT' with an initial 'EventBackend'.
runEventT :: (Monad m) => EventT m r s a -> EventBackend m r s -> m a
runEventT :: forall (m :: SelectorKind) (r :: ReferenceKind) (s :: SelectorKind)
       (a :: ReferenceKind).
Monad m =>
EventT m r s a -> EventBackend m r s -> m a
runEventT = coerce :: forall a b. Coercible a b => a -> b
coerce

-- | Lift @m@ into 'EventT' @m@.
eventLift :: forall m r s. Applicative m => StatelessControlTransformation m (EventT m r s)
eventLift :: forall (m :: SelectorKind) (r :: ReferenceKind)
       (s :: SelectorKind).
Applicative m =>
StatelessControlTransformation m (EventT m r s)
eventLift = forall (m :: SelectorKind) (n :: SelectorKind).
(Functor m, Applicative n) =>
(forall (a :: ReferenceKind).
 ((forall (x :: ReferenceKind). n x -> m x) -> m a) -> n a)
-> StatelessControlTransformation m n
statelessControlTransformation forall (a :: ReferenceKind) b. (a -> b) -> a -> b
$ \(forall (x :: ReferenceKind). EventT m r s x -> m x) -> m a
useRunInM ->
  coerce :: forall a b. Coercible a b => a -> b
coerce @(EventBackend m r s -> _) forall (a :: ReferenceKind) b. (a -> b) -> a -> b
$ \EventBackend m r s
b -> (forall (x :: ReferenceKind). EventT m r s x -> m x) -> m a
useRunInM forall (a :: ReferenceKind) b. (a -> b) -> a -> b
$ forall (a :: ReferenceKind) (b :: ReferenceKind)
       (c :: ReferenceKind).
(a -> b -> c) -> b -> a -> c
flip coerce :: forall a b. Coercible a b => a -> b
coerce EventBackend m r s
b

instance MonadReader r m => MonadReader r (EventT m ref s) where
  ask :: EventT m ref s r
ask = forall (st :: SelectorKind) (m :: SelectorKind)
       (n :: SelectorKind).
ControlTransformation st m n
-> forall (x :: ReferenceKind). m x -> n x
toNatural forall (m :: SelectorKind) (r :: ReferenceKind)
       (s :: SelectorKind).
Applicative m =>
StatelessControlTransformation m (EventT m r s)
eventLift forall (r :: ReferenceKind) (m :: SelectorKind).
MonadReader r m =>
m r
ask
  local :: forall (a :: ReferenceKind).
(r -> r) -> EventT m ref s a -> EventT m ref s a
local r -> r
modR EventT m ref s a
go = forall (m :: SelectorKind) (n :: SelectorKind)
       (a :: ReferenceKind).
Functor m =>
StatelessControlTransformation m n
-> ((forall (x :: ReferenceKind). n x -> m x) -> m a) -> n a
statelessTransWith forall (m :: SelectorKind) (r :: ReferenceKind)
       (s :: SelectorKind).
Applicative m =>
StatelessControlTransformation m (EventT m r s)
eventLift forall (a :: ReferenceKind) b. (a -> b) -> a -> b
$ \forall (x :: ReferenceKind). EventT m ref s x -> m x
runInM ->
    forall (r :: ReferenceKind) (m :: SelectorKind)
       (a :: ReferenceKind).
MonadReader r m =>
(r -> r) -> m a -> m a
local r -> r
modR (forall (x :: ReferenceKind). EventT m ref s x -> m x
runInM EventT m ref s a
go)
  reader :: forall (a :: ReferenceKind). (r -> a) -> EventT m ref s a
reader = forall (st :: SelectorKind) (m :: SelectorKind)
       (n :: SelectorKind).
ControlTransformation st m n
-> forall (x :: ReferenceKind). m x -> n x
toNatural forall (m :: SelectorKind) (r :: ReferenceKind)
       (s :: SelectorKind).
Applicative m =>
StatelessControlTransformation m (EventT m r s)
eventLift forall (b :: ReferenceKind) (c :: ReferenceKind)
       (a :: ReferenceKind).
(b -> c) -> (a -> b) -> a -> c
. forall (r :: ReferenceKind) (m :: SelectorKind)
       (a :: ReferenceKind).
MonadReader r m =>
(r -> a) -> m a
reader

instance (MonadWith m) => MonadWith (EventT m r s) where
  type WithException (EventT m r s) = WithException m
  stateThreadingGeneralWith ::
    forall a b releaseReturn.
    GeneralAllocate (EventT m r s) (WithException m) releaseReturn b a ->
    (a -> EventT m r s b) ->
    EventT m r s (b, releaseReturn)
  stateThreadingGeneralWith :: forall (a :: ReferenceKind) (b :: ReferenceKind)
       (releaseReturn :: ReferenceKind).
GeneralAllocate (EventT m r s) (WithException m) releaseReturn b a
-> (a -> EventT m r s b) -> EventT m r s (b, releaseReturn)
stateThreadingGeneralWith (GeneralAllocate (forall (x :: ReferenceKind). EventT m r s x -> EventT m r s x)
-> EventT
     m
     r
     s
     (GeneralAllocated
        (EventT m r s) (WithException m) releaseReturn b a)
allocA) a -> EventT m r s b
go = coerce :: forall a b. Coercible a b => a -> b
coerce forall (a :: ReferenceKind) b. (a -> b) -> a -> b
$ \EventBackend m r s
b -> do
    let allocA' :: (forall x. m x -> m x) -> m (GeneralAllocated m (WithException m) releaseReturn b a)
        allocA' :: (forall (x :: ReferenceKind). m x -> m x)
-> m (GeneralAllocated m (WithException m) releaseReturn b a)
allocA' forall (x :: ReferenceKind). m x -> m x
restore = do
          let restore' :: forall x. EventT m r s x -> EventT m r s x
              restore' :: forall (x :: ReferenceKind). EventT m r s x -> EventT m r s x
restore' EventT m r s x
mx = coerce :: forall a b. Coercible a b => a -> b
coerce @(EventBackend m r s -> m x) forall (a :: ReferenceKind) b. (a -> b) -> a -> b
$ forall (x :: ReferenceKind). m x -> m x
restore forall (b :: ReferenceKind) (c :: ReferenceKind)
       (a :: ReferenceKind).
(b -> c) -> (a -> b) -> a -> c
. coerce :: forall a b. Coercible a b => a -> b
coerce @_ @(EventBackend m r s -> _) EventT m r s x
mx
          GeneralAllocated a
a GeneralReleaseType (WithException m) b
-> EventT m r s releaseReturn
releaseA <- coerce :: forall a b. Coercible a b => a -> b
coerce ((forall (x :: ReferenceKind). EventT m r s x -> EventT m r s x)
-> EventT
     m
     r
     s
     (GeneralAllocated
        (EventT m r s) (WithException m) releaseReturn b a)
allocA forall (x :: ReferenceKind). EventT m r s x -> EventT m r s x
restore') EventBackend m r s
b
          let releaseA' :: GeneralReleaseType (WithException m) b -> m releaseReturn
releaseA' GeneralReleaseType (WithException m) b
relTy = coerce :: forall a b. Coercible a b => a -> b
coerce @(EventT m r s releaseReturn) @(EventBackend m r s -> m releaseReturn) (GeneralReleaseType (WithException m) b
-> EventT m r s releaseReturn
releaseA GeneralReleaseType (WithException m) b
relTy) EventBackend m r s
b
          forall (f :: SelectorKind) (a :: ReferenceKind).
Applicative f =>
a -> f a
pure forall (a :: ReferenceKind) b. (a -> b) -> a -> b
$ forall (m :: SelectorKind) (e :: ReferenceKind)
       (releaseReturn :: ReferenceKind) (releaseArg :: ReferenceKind)
       (a :: ReferenceKind).
a
-> (GeneralReleaseType e releaseArg -> m releaseReturn)
-> GeneralAllocated m e releaseReturn releaseArg a
GeneralAllocated a
a GeneralReleaseType (WithException m) b -> m releaseReturn
releaseA'
    forall (m :: SelectorKind) (releaseReturn :: ReferenceKind)
       (b :: ReferenceKind) (a :: ReferenceKind).
MonadWith m =>
GeneralAllocate m (WithException m) releaseReturn b a
-> (a -> m b) -> m (b, releaseReturn)
stateThreadingGeneralWith (forall (m :: SelectorKind) (e :: ReferenceKind)
       (releaseReturn :: ReferenceKind) (releaseArg :: ReferenceKind)
       (a :: ReferenceKind).
((forall (x :: ReferenceKind). m x -> m x)
 -> m (GeneralAllocated m e releaseReturn releaseArg a))
-> GeneralAllocate m e releaseReturn releaseArg a
GeneralAllocate (forall (x :: ReferenceKind). m x -> m x)
-> m (GeneralAllocated m (WithException m) releaseReturn b a)
allocA') (forall (a :: ReferenceKind) (b :: ReferenceKind)
       (c :: ReferenceKind).
(a -> b -> c) -> b -> a -> c
flip coerce :: forall a b. Coercible a b => a -> b
coerce EventBackend m r s
b forall (b :: ReferenceKind) (c :: ReferenceKind)
       (a :: ReferenceKind).
(b -> c) -> (a -> b) -> a -> c
. a -> EventT m r s b
go)

instance (Monad m) => MonadEvent (EventT m) where
  type BackendMonad (EventT m) = m
  liftBackendMonad :: forall a r s. m a -> EventT m r s a
  liftBackendMonad :: forall (a :: ReferenceKind) (r :: ReferenceKind)
       (s :: SelectorKind).
m a -> EventT m r s a
liftBackendMonad = coerce :: forall a b. Coercible a b => a -> b
coerce @(EventBackend m r s -> _) forall (b :: ReferenceKind) (c :: ReferenceKind)
       (a :: ReferenceKind).
(b -> c) -> (a -> b) -> a -> c
. forall (a :: ReferenceKind) (b :: ReferenceKind). a -> b -> a
const

  backend :: forall r s. EventT m r s (EventBackend m r s)
  backend :: forall (r :: ReferenceKind) (s :: SelectorKind).
EventT m r s (EventBackend m r s)
backend = coerce :: forall a b. Coercible a b => a -> b
coerce @(EventBackend m r s -> m _) forall (f :: SelectorKind) (a :: ReferenceKind).
Applicative f =>
a -> f a
pure

  withModifiedBackend :: forall r s r' s' a. (EventBackend m r s -> EventBackend m r' s') -> EventT m r' s' a -> EventT m r s a
  withModifiedBackend :: forall (r :: ReferenceKind) (s :: SelectorKind)
       (r' :: ReferenceKind) (s' :: SelectorKind) (a :: ReferenceKind).
(EventBackend m r s -> EventBackend m r' s')
-> EventT m r' s' a -> EventT m r s a
withModifiedBackend EventBackend m r s -> EventBackend m r' s'
modBackend EventT m r' s' a
e'ma =
    let e'ma' :: EventBackend m r' s' -> m a
        e'ma' :: EventBackend m r' s' -> m a
e'ma' = coerce :: forall a b. Coercible a b => a -> b
coerce EventT m r' s' a
e'ma
     in coerce :: forall a b. Coercible a b => a -> b
coerce (EventBackend m r' s' -> m a
e'ma' forall (b :: ReferenceKind) (c :: ReferenceKind)
       (a :: ReferenceKind).
(b -> c) -> (a -> b) -> a -> c
. EventBackend m r s -> EventBackend m r' s'
modBackend)

-- | Apply a 'MonadTrans'former to an 'EventMonadKind' to get a transformed 'EventMonadKind'
--
-- When @t@ is 'MonadTransControl' and @em@ is 'MonadEvent', 'TransEventMonad' @t@ @em@ is
-- 'MonadEvent' and has all of the relevant instances conferred by @t@.
type TransEventMonad :: (FunctorKind -> FunctorKind) -> EventMonadKind -> EventMonadKind
newtype TransEventMonad t em r s a = TransEventMonad {forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind).
TransEventMonad t em r s a -> t (em r s) a
unTransEventMonad :: t (em r s) a}
  deriving newtype
    ( forall (a :: ReferenceKind) (b :: ReferenceKind).
a -> TransEventMonad t em r s b -> TransEventMonad t em r s a
forall (a :: ReferenceKind) (b :: ReferenceKind).
(a -> b)
-> TransEventMonad t em r s a -> TransEventMonad t em r s b
forall (f :: SelectorKind).
(forall (a :: ReferenceKind) (b :: ReferenceKind).
 (a -> b) -> f a -> f b)
-> (forall (a :: ReferenceKind) (b :: ReferenceKind).
    a -> f b -> f a)
-> Functor f
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind)
       (b :: ReferenceKind).
Functor (t (em r s)) =>
a -> TransEventMonad t em r s b -> TransEventMonad t em r s a
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind)
       (b :: ReferenceKind).
Functor (t (em r s)) =>
(a -> b)
-> TransEventMonad t em r s a -> TransEventMonad t em r s b
<$ :: forall (a :: ReferenceKind) (b :: ReferenceKind).
a -> TransEventMonad t em r s b -> TransEventMonad t em r s a
$c<$ :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind)
       (b :: ReferenceKind).
Functor (t (em r s)) =>
a -> TransEventMonad t em r s b -> TransEventMonad t em r s a
fmap :: forall (a :: ReferenceKind) (b :: ReferenceKind).
(a -> b)
-> TransEventMonad t em r s a -> TransEventMonad t em r s b
$cfmap :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind)
       (b :: ReferenceKind).
Functor (t (em r s)) =>
(a -> b)
-> TransEventMonad t em r s a -> TransEventMonad t em r s b
Functor,
      forall (a :: ReferenceKind). a -> TransEventMonad t em r s a
forall (a :: ReferenceKind) (b :: ReferenceKind).
TransEventMonad t em r s a
-> TransEventMonad t em r s b -> TransEventMonad t em r s a
forall (a :: ReferenceKind) (b :: ReferenceKind).
TransEventMonad t em r s a
-> TransEventMonad t em r s b -> TransEventMonad t em r s b
forall (a :: ReferenceKind) (b :: ReferenceKind).
TransEventMonad t em r s (a -> b)
-> TransEventMonad t em r s a -> TransEventMonad t em r s b
forall (a :: ReferenceKind) (b :: ReferenceKind)
       (c :: ReferenceKind).
(a -> b -> c)
-> TransEventMonad t em r s a
-> TransEventMonad t em r s b
-> TransEventMonad t em r s c
forall (f :: SelectorKind).
Functor f
-> (forall (a :: ReferenceKind). a -> f a)
-> (forall (a :: ReferenceKind) (b :: ReferenceKind).
    f (a -> b) -> f a -> f b)
-> (forall (a :: ReferenceKind) (b :: ReferenceKind)
           (c :: ReferenceKind).
    (a -> b -> c) -> f a -> f b -> f c)
-> (forall (a :: ReferenceKind) (b :: ReferenceKind).
    f a -> f b -> f b)
-> (forall (a :: ReferenceKind) (b :: ReferenceKind).
    f a -> f b -> f a)
-> Applicative f
forall {t :: SelectorKind -> SelectorKind} {em :: EventMonadKind}
       {r :: ReferenceKind} {s :: SelectorKind}.
Applicative (t (em r s)) =>
Functor (TransEventMonad t em r s)
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind).
Applicative (t (em r s)) =>
a -> TransEventMonad t em r s a
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind)
       (b :: ReferenceKind).
Applicative (t (em r s)) =>
TransEventMonad t em r s a
-> TransEventMonad t em r s b -> TransEventMonad t em r s a
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind)
       (b :: ReferenceKind).
Applicative (t (em r s)) =>
TransEventMonad t em r s a
-> TransEventMonad t em r s b -> TransEventMonad t em r s b
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind)
       (b :: ReferenceKind).
Applicative (t (em r s)) =>
TransEventMonad t em r s (a -> b)
-> TransEventMonad t em r s a -> TransEventMonad t em r s b
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind)
       (b :: ReferenceKind) (c :: ReferenceKind).
Applicative (t (em r s)) =>
(a -> b -> c)
-> TransEventMonad t em r s a
-> TransEventMonad t em r s b
-> TransEventMonad t em r s c
<* :: forall (a :: ReferenceKind) (b :: ReferenceKind).
TransEventMonad t em r s a
-> TransEventMonad t em r s b -> TransEventMonad t em r s a
$c<* :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind)
       (b :: ReferenceKind).
Applicative (t (em r s)) =>
TransEventMonad t em r s a
-> TransEventMonad t em r s b -> TransEventMonad t em r s a
*> :: forall (a :: ReferenceKind) (b :: ReferenceKind).
TransEventMonad t em r s a
-> TransEventMonad t em r s b -> TransEventMonad t em r s b
$c*> :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind)
       (b :: ReferenceKind).
Applicative (t (em r s)) =>
TransEventMonad t em r s a
-> TransEventMonad t em r s b -> TransEventMonad t em r s b
liftA2 :: forall (a :: ReferenceKind) (b :: ReferenceKind)
       (c :: ReferenceKind).
(a -> b -> c)
-> TransEventMonad t em r s a
-> TransEventMonad t em r s b
-> TransEventMonad t em r s c
$cliftA2 :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind)
       (b :: ReferenceKind) (c :: ReferenceKind).
Applicative (t (em r s)) =>
(a -> b -> c)
-> TransEventMonad t em r s a
-> TransEventMonad t em r s b
-> TransEventMonad t em r s c
<*> :: forall (a :: ReferenceKind) (b :: ReferenceKind).
TransEventMonad t em r s (a -> b)
-> TransEventMonad t em r s a -> TransEventMonad t em r s b
$c<*> :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind)
       (b :: ReferenceKind).
Applicative (t (em r s)) =>
TransEventMonad t em r s (a -> b)
-> TransEventMonad t em r s a -> TransEventMonad t em r s b
pure :: forall (a :: ReferenceKind). a -> TransEventMonad t em r s a
$cpure :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind).
Applicative (t (em r s)) =>
a -> TransEventMonad t em r s a
Applicative,
      forall (a :: ReferenceKind). a -> TransEventMonad t em r s a
forall (a :: ReferenceKind) (b :: ReferenceKind).
TransEventMonad t em r s a
-> TransEventMonad t em r s b -> TransEventMonad t em r s b
forall (a :: ReferenceKind) (b :: ReferenceKind).
TransEventMonad t em r s a
-> (a -> TransEventMonad t em r s b) -> TransEventMonad t em r s b
forall (m :: SelectorKind).
Applicative m
-> (forall (a :: ReferenceKind) (b :: ReferenceKind).
    m a -> (a -> m b) -> m b)
-> (forall (a :: ReferenceKind) (b :: ReferenceKind).
    m a -> m b -> m b)
-> (forall (a :: ReferenceKind). a -> m a)
-> Monad m
forall {t :: SelectorKind -> SelectorKind} {em :: EventMonadKind}
       {r :: ReferenceKind} {s :: SelectorKind}.
Monad (t (em r s)) =>
Applicative (TransEventMonad t em r s)
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind).
Monad (t (em r s)) =>
a -> TransEventMonad t em r s a
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind)
       (b :: ReferenceKind).
Monad (t (em r s)) =>
TransEventMonad t em r s a
-> TransEventMonad t em r s b -> TransEventMonad t em r s b
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind)
       (b :: ReferenceKind).
Monad (t (em r s)) =>
TransEventMonad t em r s a
-> (a -> TransEventMonad t em r s b) -> TransEventMonad t em r s b
return :: forall (a :: ReferenceKind). a -> TransEventMonad t em r s a
$creturn :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind).
Monad (t (em r s)) =>
a -> TransEventMonad t em r s a
>> :: forall (a :: ReferenceKind) (b :: ReferenceKind).
TransEventMonad t em r s a
-> TransEventMonad t em r s b -> TransEventMonad t em r s b
$c>> :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind)
       (b :: ReferenceKind).
Monad (t (em r s)) =>
TransEventMonad t em r s a
-> TransEventMonad t em r s b -> TransEventMonad t em r s b
>>= :: forall (a :: ReferenceKind) (b :: ReferenceKind).
TransEventMonad t em r s a
-> (a -> TransEventMonad t em r s b) -> TransEventMonad t em r s b
$c>>= :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind)
       (b :: ReferenceKind).
Monad (t (em r s)) =>
TransEventMonad t em r s a
-> (a -> TransEventMonad t em r s b) -> TransEventMonad t em r s b
Monad,
      MonadError e,
      MonadState s',
      MonadWriter w,
      forall (a :: ReferenceKind). String -> TransEventMonad t em r s a
forall (m :: SelectorKind).
Monad m
-> (forall (a :: ReferenceKind). String -> m a) -> MonadFail m
forall {t :: SelectorKind -> SelectorKind} {em :: EventMonadKind}
       {r :: ReferenceKind} {s :: SelectorKind}.
MonadFail (t (em r s)) =>
Monad (TransEventMonad t em r s)
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind).
MonadFail (t (em r s)) =>
String -> TransEventMonad t em r s a
fail :: forall (a :: ReferenceKind). String -> TransEventMonad t em r s a
$cfail :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind).
MonadFail (t (em r s)) =>
String -> TransEventMonad t em r s a
MonadFail,
      forall (a :: ReferenceKind).
(a -> TransEventMonad t em r s a) -> TransEventMonad t em r s a
forall (m :: SelectorKind).
Monad m
-> (forall (a :: ReferenceKind). (a -> m a) -> m a) -> MonadFix m
forall {t :: SelectorKind -> SelectorKind} {em :: EventMonadKind}
       {r :: ReferenceKind} {s :: SelectorKind}.
MonadFix (t (em r s)) =>
Monad (TransEventMonad t em r s)
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind).
MonadFix (t (em r s)) =>
(a -> TransEventMonad t em r s a) -> TransEventMonad t em r s a
mfix :: forall (a :: ReferenceKind).
(a -> TransEventMonad t em r s a) -> TransEventMonad t em r s a
$cmfix :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind).
MonadFix (t (em r s)) =>
(a -> TransEventMonad t em r s a) -> TransEventMonad t em r s a
MonadFix,
      forall (a :: ReferenceKind). IO a -> TransEventMonad t em r s a
forall (m :: SelectorKind).
Monad m -> (forall (a :: ReferenceKind). IO a -> m a) -> MonadIO m
forall {t :: SelectorKind -> SelectorKind} {em :: EventMonadKind}
       {r :: ReferenceKind} {s :: SelectorKind}.
MonadIO (t (em r s)) =>
Monad (TransEventMonad t em r s)
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind).
MonadIO (t (em r s)) =>
IO a -> TransEventMonad t em r s a
liftIO :: forall (a :: ReferenceKind). IO a -> TransEventMonad t em r s a
$cliftIO :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind).
MonadIO (t (em r s)) =>
IO a -> TransEventMonad t em r s a
MonadIO,
      forall (a :: ReferenceKind) (b :: ReferenceKind).
TransEventMonad t em r s a
-> TransEventMonad t em r s b -> TransEventMonad t em r s (a, b)
forall (a :: ReferenceKind) (b :: ReferenceKind).
TransEventMonad t em r s (a, b)
-> (TransEventMonad t em r s a, TransEventMonad t em r s b)
forall (a :: ReferenceKind) (b :: ReferenceKind)
       (c :: ReferenceKind).
(a -> b -> c)
-> TransEventMonad t em r s a
-> TransEventMonad t em r s b
-> TransEventMonad t em r s c
forall (m :: SelectorKind).
Monad m
-> (forall (a :: ReferenceKind) (b :: ReferenceKind).
    m a -> m b -> m (a, b))
-> (forall (a :: ReferenceKind) (b :: ReferenceKind)
           (c :: ReferenceKind).
    (a -> b -> c) -> m a -> m b -> m c)
-> (forall (a :: ReferenceKind) (b :: ReferenceKind).
    m (a, b) -> (m a, m b))
-> MonadZip m
forall {t :: SelectorKind -> SelectorKind} {em :: EventMonadKind}
       {r :: ReferenceKind} {s :: SelectorKind}.
MonadZip (t (em r s)) =>
Monad (TransEventMonad t em r s)
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind)
       (b :: ReferenceKind).
MonadZip (t (em r s)) =>
TransEventMonad t em r s a
-> TransEventMonad t em r s b -> TransEventMonad t em r s (a, b)
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind)
       (b :: ReferenceKind).
MonadZip (t (em r s)) =>
TransEventMonad t em r s (a, b)
-> (TransEventMonad t em r s a, TransEventMonad t em r s b)
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind)
       (b :: ReferenceKind) (c :: ReferenceKind).
MonadZip (t (em r s)) =>
(a -> b -> c)
-> TransEventMonad t em r s a
-> TransEventMonad t em r s b
-> TransEventMonad t em r s c
munzip :: forall (a :: ReferenceKind) (b :: ReferenceKind).
TransEventMonad t em r s (a, b)
-> (TransEventMonad t em r s a, TransEventMonad t em r s b)
$cmunzip :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind)
       (b :: ReferenceKind).
MonadZip (t (em r s)) =>
TransEventMonad t em r s (a, b)
-> (TransEventMonad t em r s a, TransEventMonad t em r s b)
mzipWith :: forall (a :: ReferenceKind) (b :: ReferenceKind)
       (c :: ReferenceKind).
(a -> b -> c)
-> TransEventMonad t em r s a
-> TransEventMonad t em r s b
-> TransEventMonad t em r s c
$cmzipWith :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind)
       (b :: ReferenceKind) (c :: ReferenceKind).
MonadZip (t (em r s)) =>
(a -> b -> c)
-> TransEventMonad t em r s a
-> TransEventMonad t em r s b
-> TransEventMonad t em r s c
mzip :: forall (a :: ReferenceKind) (b :: ReferenceKind).
TransEventMonad t em r s a
-> TransEventMonad t em r s b -> TransEventMonad t em r s (a, b)
$cmzip :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind)
       (b :: ReferenceKind).
MonadZip (t (em r s)) =>
TransEventMonad t em r s a
-> TransEventMonad t em r s b -> TransEventMonad t em r s (a, b)
MonadZip,
      forall (b :: ReferenceKind) (a :: ReferenceKind).
b -> TransEventMonad t em r s b -> TransEventMonad t em r s a
forall (a' :: ReferenceKind) (a :: ReferenceKind).
(a' -> a)
-> TransEventMonad t em r s a -> TransEventMonad t em r s a'
forall (f :: SelectorKind).
(forall (a' :: ReferenceKind) (a :: ReferenceKind).
 (a' -> a) -> f a -> f a')
-> (forall (b :: ReferenceKind) (a :: ReferenceKind).
    b -> f b -> f a)
-> Contravariant f
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (b :: ReferenceKind)
       (a :: ReferenceKind).
Contravariant (t (em r s)) =>
b -> TransEventMonad t em r s b -> TransEventMonad t em r s a
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a' :: ReferenceKind)
       (a :: ReferenceKind).
Contravariant (t (em r s)) =>
(a' -> a)
-> TransEventMonad t em r s a -> TransEventMonad t em r s a'
>$ :: forall (b :: ReferenceKind) (a :: ReferenceKind).
b -> TransEventMonad t em r s b -> TransEventMonad t em r s a
$c>$ :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (b :: ReferenceKind)
       (a :: ReferenceKind).
Contravariant (t (em r s)) =>
b -> TransEventMonad t em r s b -> TransEventMonad t em r s a
contramap :: forall (a' :: ReferenceKind) (a :: ReferenceKind).
(a' -> a)
-> TransEventMonad t em r s a -> TransEventMonad t em r s a'
$ccontramap :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a' :: ReferenceKind)
       (a :: ReferenceKind).
Contravariant (t (em r s)) =>
(a' -> a)
-> TransEventMonad t em r s a -> TransEventMonad t em r s a'
Contravariant,
      forall (a :: ReferenceKind). TransEventMonad t em r s a
forall (a :: ReferenceKind).
TransEventMonad t em r s a -> TransEventMonad t em r s [a]
forall (a :: ReferenceKind).
TransEventMonad t em r s a
-> TransEventMonad t em r s a -> TransEventMonad t em r s a
forall (f :: SelectorKind).
Applicative f
-> (forall (a :: ReferenceKind). f a)
-> (forall (a :: ReferenceKind). f a -> f a -> f a)
-> (forall (a :: ReferenceKind). f a -> f [a])
-> (forall (a :: ReferenceKind). f a -> f [a])
-> Alternative f
forall {t :: SelectorKind -> SelectorKind} {em :: EventMonadKind}
       {r :: ReferenceKind} {s :: SelectorKind}.
Alternative (t (em r s)) =>
Applicative (TransEventMonad t em r s)
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind).
Alternative (t (em r s)) =>
TransEventMonad t em r s a
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind).
Alternative (t (em r s)) =>
TransEventMonad t em r s a -> TransEventMonad t em r s [a]
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind).
Alternative (t (em r s)) =>
TransEventMonad t em r s a
-> TransEventMonad t em r s a -> TransEventMonad t em r s a
many :: forall (a :: ReferenceKind).
TransEventMonad t em r s a -> TransEventMonad t em r s [a]
$cmany :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind).
Alternative (t (em r s)) =>
TransEventMonad t em r s a -> TransEventMonad t em r s [a]
some :: forall (a :: ReferenceKind).
TransEventMonad t em r s a -> TransEventMonad t em r s [a]
$csome :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind).
Alternative (t (em r s)) =>
TransEventMonad t em r s a -> TransEventMonad t em r s [a]
<|> :: forall (a :: ReferenceKind).
TransEventMonad t em r s a
-> TransEventMonad t em r s a -> TransEventMonad t em r s a
$c<|> :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind).
Alternative (t (em r s)) =>
TransEventMonad t em r s a
-> TransEventMonad t em r s a -> TransEventMonad t em r s a
empty :: forall (a :: ReferenceKind). TransEventMonad t em r s a
$cempty :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind).
Alternative (t (em r s)) =>
TransEventMonad t em r s a
Alternative,
      forall (a :: ReferenceKind). TransEventMonad t em r s a
forall (a :: ReferenceKind).
TransEventMonad t em r s a
-> TransEventMonad t em r s a -> TransEventMonad t em r s a
forall (m :: SelectorKind).
Alternative m
-> Monad m
-> (forall (a :: ReferenceKind). m a)
-> (forall (a :: ReferenceKind). m a -> m a -> m a)
-> MonadPlus m
forall {t :: SelectorKind -> SelectorKind} {em :: EventMonadKind}
       {r :: ReferenceKind} {s :: SelectorKind}.
MonadPlus (t (em r s)) =>
Monad (TransEventMonad t em r s)
forall {t :: SelectorKind -> SelectorKind} {em :: EventMonadKind}
       {r :: ReferenceKind} {s :: SelectorKind}.
MonadPlus (t (em r s)) =>
Alternative (TransEventMonad t em r s)
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind).
MonadPlus (t (em r s)) =>
TransEventMonad t em r s a
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind).
MonadPlus (t (em r s)) =>
TransEventMonad t em r s a
-> TransEventMonad t em r s a -> TransEventMonad t em r s a
mplus :: forall (a :: ReferenceKind).
TransEventMonad t em r s a
-> TransEventMonad t em r s a -> TransEventMonad t em r s a
$cmplus :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind).
MonadPlus (t (em r s)) =>
TransEventMonad t em r s a
-> TransEventMonad t em r s a -> TransEventMonad t em r s a
mzero :: forall (a :: ReferenceKind). TransEventMonad t em r s a
$cmzero :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind).
MonadPlus (t (em r s)) =>
TransEventMonad t em r s a
MonadPlus,
      forall (a :: ReferenceKind) (b :: ReferenceKind).
((a -> TransEventMonad t em r s b) -> TransEventMonad t em r s a)
-> TransEventMonad t em r s a
forall (m :: SelectorKind).
Monad m
-> (forall (a :: ReferenceKind) (b :: ReferenceKind).
    ((a -> m b) -> m a) -> m a)
-> MonadCont m
forall {t :: SelectorKind -> SelectorKind} {em :: EventMonadKind}
       {r :: ReferenceKind} {s :: SelectorKind}.
MonadCont (t (em r s)) =>
Monad (TransEventMonad t em r s)
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind)
       (b :: ReferenceKind).
MonadCont (t (em r s)) =>
((a -> TransEventMonad t em r s b) -> TransEventMonad t em r s a)
-> TransEventMonad t em r s a
callCC :: forall (a :: ReferenceKind) (b :: ReferenceKind).
((a -> TransEventMonad t em r s b) -> TransEventMonad t em r s a)
-> TransEventMonad t em r s a
$ccallCC :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind)
       (b :: ReferenceKind).
MonadCont (t (em r s)) =>
((a -> TransEventMonad t em r s b) -> TransEventMonad t em r s a)
-> TransEventMonad t em r s a
MonadCont,
      forall (b :: ReferenceKind).
((forall (a :: ReferenceKind). TransEventMonad t em r s a -> IO a)
 -> IO b)
-> TransEventMonad t em r s b
forall (m :: SelectorKind).
MonadIO m
-> (forall (b :: ReferenceKind).
    ((forall (a :: ReferenceKind). m a -> IO a) -> IO b) -> m b)
-> MonadUnliftIO m
forall {t :: SelectorKind -> SelectorKind} {em :: EventMonadKind}
       {r :: ReferenceKind} {s :: SelectorKind}.
MonadUnliftIO (t (em r s)) =>
MonadIO (TransEventMonad t em r s)
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (b :: ReferenceKind).
MonadUnliftIO (t (em r s)) =>
((forall (a :: ReferenceKind). TransEventMonad t em r s a -> IO a)
 -> IO b)
-> TransEventMonad t em r s b
withRunInIO :: forall (b :: ReferenceKind).
((forall (a :: ReferenceKind). TransEventMonad t em r s a -> IO a)
 -> IO b)
-> TransEventMonad t em r s b
$cwithRunInIO :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (b :: ReferenceKind).
MonadUnliftIO (t (em r s)) =>
((forall (a :: ReferenceKind). TransEventMonad t em r s a -> IO a)
 -> IO b)
-> TransEventMonad t em r s b
MonadUnliftIO,
      MonadBase b,
      MonadBaseControl b,
      GeneralReleaseKey (TransEventMonad t em r s)
-> AllocationContext (TransEventMonad t em r s) ()
(GeneralReleaseType
   (AllocationException (TransEventMonad t em r s)) ()
 -> AllocationContext (TransEventMonad t em r s) ())
-> TransEventMonad
     t em r s (GeneralReleaseKey (TransEventMonad t em r s))
forall (a :: ReferenceKind).
GeneralAllocate
  (AllocationContext (TransEventMonad t em r s))
  (AllocationException (TransEventMonad t em r s))
  ()
  ()
  a
-> TransEventMonad
     t em r s (GeneralReleaseKey (TransEventMonad t em r s), a)
forall (m :: SelectorKind).
Monad m
-> Monad (AllocationContext m)
-> (forall (a :: ReferenceKind).
    GeneralAllocate
      (AllocationContext m) (AllocationException m) () () a
    -> m (GeneralReleaseKey m, a))
-> ((GeneralReleaseType (AllocationException m) ()
     -> AllocationContext m ())
    -> m (GeneralReleaseKey m))
-> (GeneralReleaseKey m -> AllocationContext m ())
-> MonadAllocate m
forall {t :: SelectorKind -> SelectorKind} {em :: EventMonadKind}
       {r :: ReferenceKind} {s :: SelectorKind}.
MonadAllocate (t (em r s)) =>
Monad (AllocationContext (TransEventMonad t em r s))
forall {t :: SelectorKind -> SelectorKind} {em :: EventMonadKind}
       {r :: ReferenceKind} {s :: SelectorKind}.
MonadAllocate (t (em r s)) =>
Monad (TransEventMonad t em r s)
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind).
MonadAllocate (t (em r s)) =>
GeneralReleaseKey (TransEventMonad t em r s)
-> AllocationContext (TransEventMonad t em r s) ()
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind).
MonadAllocate (t (em r s)) =>
(GeneralReleaseType
   (AllocationException (TransEventMonad t em r s)) ()
 -> AllocationContext (TransEventMonad t em r s) ())
-> TransEventMonad
     t em r s (GeneralReleaseKey (TransEventMonad t em r s))
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind).
MonadAllocate (t (em r s)) =>
GeneralAllocate
  (AllocationContext (TransEventMonad t em r s))
  (AllocationException (TransEventMonad t em r s))
  ()
  ()
  a
-> TransEventMonad
     t em r s (GeneralReleaseKey (TransEventMonad t em r s), a)
generalRelease :: GeneralReleaseKey (TransEventMonad t em r s)
-> AllocationContext (TransEventMonad t em r s) ()
$cgeneralRelease :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind).
MonadAllocate (t (em r s)) =>
GeneralReleaseKey (TransEventMonad t em r s)
-> AllocationContext (TransEventMonad t em r s) ()
generalRegister :: (GeneralReleaseType
   (AllocationException (TransEventMonad t em r s)) ()
 -> AllocationContext (TransEventMonad t em r s) ())
-> TransEventMonad
     t em r s (GeneralReleaseKey (TransEventMonad t em r s))
$cgeneralRegister :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind).
MonadAllocate (t (em r s)) =>
(GeneralReleaseType
   (AllocationException (TransEventMonad t em r s)) ()
 -> AllocationContext (TransEventMonad t em r s) ())
-> TransEventMonad
     t em r s (GeneralReleaseKey (TransEventMonad t em r s))
generalAllocate :: forall (a :: ReferenceKind).
GeneralAllocate
  (AllocationContext (TransEventMonad t em r s))
  (AllocationException (TransEventMonad t em r s))
  ()
  ()
  a
-> TransEventMonad
     t em r s (GeneralReleaseKey (TransEventMonad t em r s), a)
$cgeneralAllocate :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind).
MonadAllocate (t (em r s)) =>
GeneralAllocate
  (AllocationContext (TransEventMonad t em r s))
  (AllocationException (TransEventMonad t em r s))
  ()
  ()
  a
-> TransEventMonad
     t em r s (GeneralReleaseKey (TransEventMonad t em r s), a)
MonadAllocate,
      forall (e :: ReferenceKind) (a :: ReferenceKind).
Exception e =>
TransEventMonad t em r s a
-> (e -> TransEventMonad t em r s a) -> TransEventMonad t em r s a
forall (m :: SelectorKind).
MonadThrow m
-> (forall (e :: ReferenceKind) (a :: ReferenceKind).
    Exception e =>
    m a -> (e -> m a) -> m a)
-> MonadCatch m
forall {t :: SelectorKind -> SelectorKind} {em :: EventMonadKind}
       {r :: ReferenceKind} {s :: SelectorKind}.
MonadCatch (t (em r s)) =>
MonadThrow (TransEventMonad t em r s)
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (e :: ReferenceKind)
       (a :: ReferenceKind).
(MonadCatch (t (em r s)), Exception e) =>
TransEventMonad t em r s a
-> (e -> TransEventMonad t em r s a) -> TransEventMonad t em r s a
catch :: forall (e :: ReferenceKind) (a :: ReferenceKind).
Exception e =>
TransEventMonad t em r s a
-> (e -> TransEventMonad t em r s a) -> TransEventMonad t em r s a
$ccatch :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (e :: ReferenceKind)
       (a :: ReferenceKind).
(MonadCatch (t (em r s)), Exception e) =>
TransEventMonad t em r s a
-> (e -> TransEventMonad t em r s a) -> TransEventMonad t em r s a
MonadCatch,
      forall (e :: ReferenceKind) (a :: ReferenceKind).
Exception e =>
e -> TransEventMonad t em r s a
forall (m :: SelectorKind).
Monad m
-> (forall (e :: ReferenceKind) (a :: ReferenceKind).
    Exception e =>
    e -> m a)
-> MonadThrow m
forall {t :: SelectorKind -> SelectorKind} {em :: EventMonadKind}
       {r :: ReferenceKind} {s :: SelectorKind}.
MonadThrow (t (em r s)) =>
Monad (TransEventMonad t em r s)
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (e :: ReferenceKind)
       (a :: ReferenceKind).
(MonadThrow (t (em r s)), Exception e) =>
e -> TransEventMonad t em r s a
throwM :: forall (e :: ReferenceKind) (a :: ReferenceKind).
Exception e =>
e -> TransEventMonad t em r s a
$cthrowM :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (e :: ReferenceKind)
       (a :: ReferenceKind).
(MonadThrow (t (em r s)), Exception e) =>
e -> TransEventMonad t em r s a
MonadThrow,
      forall (b :: ReferenceKind).
((forall (a :: ReferenceKind).
  TransEventMonad t em r s a -> TransEventMonad t em r s a)
 -> TransEventMonad t em r s b)
-> TransEventMonad t em r s b
forall (a :: ReferenceKind) (b :: ReferenceKind)
       (c :: ReferenceKind).
TransEventMonad t em r s a
-> (a -> ExitCase b -> TransEventMonad t em r s c)
-> (a -> TransEventMonad t em r s b)
-> TransEventMonad t em r s (b, c)
forall (m :: SelectorKind).
MonadCatch m
-> (forall (b :: ReferenceKind).
    ((forall (a :: ReferenceKind). m a -> m a) -> m b) -> m b)
-> (forall (b :: ReferenceKind).
    ((forall (a :: ReferenceKind). m a -> m a) -> m b) -> m b)
-> (forall (a :: ReferenceKind) (b :: ReferenceKind)
           (c :: ReferenceKind).
    m a -> (a -> ExitCase b -> m c) -> (a -> m b) -> m (b, c))
-> MonadMask m
forall {t :: SelectorKind -> SelectorKind} {em :: EventMonadKind}
       {r :: ReferenceKind} {s :: SelectorKind}.
MonadMask (t (em r s)) =>
MonadCatch (TransEventMonad t em r s)
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (b :: ReferenceKind).
MonadMask (t (em r s)) =>
((forall (a :: ReferenceKind).
  TransEventMonad t em r s a -> TransEventMonad t em r s a)
 -> TransEventMonad t em r s b)
-> TransEventMonad t em r s b
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind)
       (b :: ReferenceKind) (c :: ReferenceKind).
MonadMask (t (em r s)) =>
TransEventMonad t em r s a
-> (a -> ExitCase b -> TransEventMonad t em r s c)
-> (a -> TransEventMonad t em r s b)
-> TransEventMonad t em r s (b, c)
generalBracket :: forall (a :: ReferenceKind) (b :: ReferenceKind)
       (c :: ReferenceKind).
TransEventMonad t em r s a
-> (a -> ExitCase b -> TransEventMonad t em r s c)
-> (a -> TransEventMonad t em r s b)
-> TransEventMonad t em r s (b, c)
$cgeneralBracket :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind)
       (b :: ReferenceKind) (c :: ReferenceKind).
MonadMask (t (em r s)) =>
TransEventMonad t em r s a
-> (a -> ExitCase b -> TransEventMonad t em r s c)
-> (a -> TransEventMonad t em r s b)
-> TransEventMonad t em r s (b, c)
uninterruptibleMask :: forall (b :: ReferenceKind).
((forall (a :: ReferenceKind).
  TransEventMonad t em r s a -> TransEventMonad t em r s a)
 -> TransEventMonad t em r s b)
-> TransEventMonad t em r s b
$cuninterruptibleMask :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (b :: ReferenceKind).
MonadMask (t (em r s)) =>
((forall (a :: ReferenceKind).
  TransEventMonad t em r s a -> TransEventMonad t em r s a)
 -> TransEventMonad t em r s b)
-> TransEventMonad t em r s b
mask :: forall (b :: ReferenceKind).
((forall (a :: ReferenceKind).
  TransEventMonad t em r s a -> TransEventMonad t em r s a)
 -> TransEventMonad t em r s b)
-> TransEventMonad t em r s b
$cmask :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (b :: ReferenceKind).
MonadMask (t (em r s)) =>
((forall (a :: ReferenceKind).
  TransEventMonad t em r s a -> TransEventMonad t em r s a)
 -> TransEventMonad t em r s b)
-> TransEventMonad t em r s b
MonadMask,
      forall (a :: ReferenceKind).
(State# (PrimState (TransEventMonad t em r s))
 -> (# State# (PrimState (TransEventMonad t em r s)), a #))
-> TransEventMonad t em r s a
forall (m :: SelectorKind).
Monad m
-> (forall (a :: ReferenceKind).
    (State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a)
-> PrimMonad m
forall {t :: SelectorKind -> SelectorKind} {em :: EventMonadKind}
       {r :: ReferenceKind} {s :: SelectorKind}.
PrimMonad (t (em r s)) =>
Monad (TransEventMonad t em r s)
forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind).
PrimMonad (t (em r s)) =>
(State# (PrimState (TransEventMonad t em r s))
 -> (# State# (PrimState (TransEventMonad t em r s)), a #))
-> TransEventMonad t em r s a
primitive :: forall (a :: ReferenceKind).
(State# (PrimState (TransEventMonad t em r s))
 -> (# State# (PrimState (TransEventMonad t em r s)), a #))
-> TransEventMonad t em r s a
$cprimitive :: forall (t :: SelectorKind -> SelectorKind) (em :: EventMonadKind)
       (r :: ReferenceKind) (s :: SelectorKind) (a :: ReferenceKind).
PrimMonad (t (em r s)) =>
(State# (PrimState (TransEventMonad t em r s))
 -> (# State# (PrimState (TransEventMonad t em r s)), a #))
-> TransEventMonad t em r s a
PrimMonad,
      MonadReader r'
    )

instance MonadWith (t (em r s)) => MonadWith (TransEventMonad t em r s) where
  type WithException (TransEventMonad t em r s) = WithException (t (em r s))
  stateThreadingGeneralWith ::
    forall a b releaseReturn.
    GeneralAllocate (TransEventMonad t em r s) (WithException (t (em r s))) releaseReturn b a ->
    (a -> TransEventMonad t em r s b) ->
    TransEventMonad t em r s (b, releaseReturn)
  stateThreadingGeneralWith :: forall (a :: ReferenceKind) (b :: ReferenceKind)
       (releaseReturn :: ReferenceKind).
GeneralAllocate
  (TransEventMonad t em r s)
  (WithException (t (em r s)))
  releaseReturn
  b
  a
-> (a -> TransEventMonad t em r s b)
-> TransEventMonad t em r s (b, releaseReturn)
stateThreadingGeneralWith (GeneralAllocate (forall (x :: ReferenceKind).
 TransEventMonad t em r s x -> TransEventMonad t em r s x)
-> TransEventMonad
     t
     em
     r
     s
     (GeneralAllocated
        (TransEventMonad t em r s)
        (WithException (t (em r s)))
        releaseReturn
        b
        a)
allocA) a -> TransEventMonad t em r s b
go = coerce :: forall a b. Coercible a b => a -> b
coerce forall (a :: ReferenceKind) b. (a -> b) -> a -> b
$ do
    forall (m :: SelectorKind) (releaseReturn :: ReferenceKind)
       (b :: ReferenceKind) (a :: ReferenceKind).
MonadWith m =>
GeneralAllocate m (WithException m) releaseReturn b a
-> (a -> m b) -> m (b, releaseReturn)
stateThreadingGeneralWith (forall (m :: SelectorKind) (e :: ReferenceKind)
       (releaseReturn :: ReferenceKind) (releaseArg :: ReferenceKind)
       (a :: ReferenceKind).
((forall (x :: ReferenceKind). m x -> m x)
 -> m (GeneralAllocated m e releaseReturn releaseArg a))
-> GeneralAllocate m e releaseReturn releaseArg a
GeneralAllocate (forall (x :: ReferenceKind). t (em r s) x -> t (em r s) x)
-> t (em r s)
     (GeneralAllocated
        (t (em r s)) (WithException (t (em r s))) releaseReturn b a)
allocA') forall (a :: ReferenceKind) b. (a -> b) -> a -> b
$ coerce :: forall a b. Coercible a b => a -> b
coerce a -> TransEventMonad t em r s b
go
    where
      allocA' :: (forall x. t (em r s) x -> t (em r s) x) -> t (em r s) (GeneralAllocated (t (em r s)) (WithException (t (em r s))) releaseReturn b a)
      allocA' :: (forall (x :: ReferenceKind). t (em r s) x -> t (em r s) x)
-> t (em r s)
     (GeneralAllocated
        (t (em r s)) (WithException (t (em r s))) releaseReturn b a)
allocA' forall (x :: ReferenceKind). t (em r s) x -> t (em r s) x
restore =
        coerce :: forall a b. Coercible a b => a -> b
coerce ((forall (x :: ReferenceKind).
 TransEventMonad t em r s x -> TransEventMonad t em r s x)
-> TransEventMonad
     t
     em
     r
     s
     (GeneralAllocated
        (TransEventMonad t em r s)
        (WithException (t (em r s)))
        releaseReturn
        b
        a)
allocA forall (x :: ReferenceKind).
TransEventMonad t em r s x -> TransEventMonad t em r s x
restore') forall (f :: SelectorKind) (a :: ReferenceKind)
       (b :: ReferenceKind).
Functor f =>
f a -> (a -> b) -> f b
<&> \case
          GeneralAllocated a
a GeneralReleaseType (WithException (t (em r s))) b
-> TransEventMonad t em r s releaseReturn
releaseA -> forall (m :: SelectorKind) (e :: ReferenceKind)
       (releaseReturn :: ReferenceKind) (releaseArg :: ReferenceKind)
       (a :: ReferenceKind).
a
-> (GeneralReleaseType e releaseArg -> m releaseReturn)
-> GeneralAllocated m e releaseReturn releaseArg a
GeneralAllocated a
a forall (a :: ReferenceKind) b. (a -> b) -> a -> b
$ coerce :: forall a b. Coercible a b => a -> b
coerce @(GeneralReleaseType (WithException (t (em r s))) b -> TransEventMonad t em r s releaseReturn) GeneralReleaseType (WithException (t (em r s))) b
-> TransEventMonad t em r s releaseReturn
releaseA
        where
          restore' :: forall x. TransEventMonad t em r s x -> TransEventMonad t em r s x
          restore' :: forall (x :: ReferenceKind).
TransEventMonad t em r s x -> TransEventMonad t em r s x
restore' = coerce :: forall a b. Coercible a b => a -> b
coerce @(t (em r s) x -> t (em r s) x) forall (x :: ReferenceKind). t (em r s) x -> t (em r s) x
restore

instance (MonadEvent em, MonadTransControl t, forall r s. Monad (t (em r s))) => MonadEvent (TransEventMonad t em) where
  type BackendMonad (TransEventMonad t em) = BackendMonad em
  liftBackendMonad :: forall a r s. BackendMonad em a -> TransEventMonad t em r s a
  liftBackendMonad :: forall (a :: ReferenceKind) (r :: ReferenceKind)
       (s :: SelectorKind).
BackendMonad em a -> TransEventMonad t em r s a
liftBackendMonad = coerce :: forall a b. Coercible a b => a -> b
coerce @(_ -> t (em r s) a) forall (a :: ReferenceKind) b. (a -> b) -> a -> b
$ forall (t :: SelectorKind -> SelectorKind) (m :: SelectorKind)
       (a :: ReferenceKind).
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall (b :: ReferenceKind) (c :: ReferenceKind)
       (a :: ReferenceKind).
(b -> c) -> (a -> b) -> a -> c
. forall (em :: EventMonadKind) (a :: ReferenceKind)
       (r :: ReferenceKind) (s :: SelectorKind).
MonadEvent em =>
BackendMonad em a -> em r s a
liftBackendMonad

  backend :: forall r s. TransEventMonad t em r s (EnvBackend em r s)
  backend :: forall (r :: ReferenceKind) (s :: SelectorKind).
TransEventMonad t em r s (EnvBackend em r s)
backend = coerce :: forall a b. Coercible a b => a -> b
coerce @(t (em r s) _) forall (a :: ReferenceKind) b. (a -> b) -> a -> b
$ forall (t :: SelectorKind -> SelectorKind) (m :: SelectorKind)
       (a :: ReferenceKind).
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall (em :: EventMonadKind) (r :: ReferenceKind)
       (s :: SelectorKind).
MonadEvent em =>
em r s (EnvBackend em r s)
backend

  withModifiedBackend :: forall r s r' s' a. (EnvBackend em r s -> EnvBackend em r' s') -> TransEventMonad t em r' s' a -> TransEventMonad t em r s a
  withModifiedBackend :: forall (r :: ReferenceKind) (s :: SelectorKind)
       (r' :: ReferenceKind) (s' :: SelectorKind) (a :: ReferenceKind).
(EnvBackend em r s -> EnvBackend em r' s')
-> TransEventMonad t em r' s' a -> TransEventMonad t em r s a
withModifiedBackend EnvBackend em r s -> EnvBackend em r' s'
modBackend TransEventMonad t em r' s' a
go = coerce :: forall a b. Coercible a b => a -> b
coerce @(t (em r s) _) forall (a :: ReferenceKind) b. (a -> b) -> a -> b
$
    forall (t :: SelectorKind -> SelectorKind) (m :: SelectorKind)
       (a :: ReferenceKind).
(MonadTransControl t, Monad (t m), Monad m) =>
(Run t -> m (StT t a)) -> t m a
controlT @_ @_ @a forall (a :: ReferenceKind) b. (a -> b) -> a -> b
$ \Run t
runInEm ->
      forall (em :: EventMonadKind) (r :: ReferenceKind)
       (s :: SelectorKind) (r' :: ReferenceKind) (s' :: SelectorKind)
       (a :: ReferenceKind).
MonadEvent em =>
(EnvBackend em r s -> EnvBackend em r' s')
-> em r' s' a -> em r s a
withModifiedBackend EnvBackend em r s -> EnvBackend em r' s'
modBackend forall (b :: ReferenceKind) (c :: ReferenceKind)
       (a :: ReferenceKind).
(b -> c) -> (a -> b) -> a -> c
. Run t
runInEm forall (a :: ReferenceKind) b. (a -> b) -> a -> b
$ coerce :: forall a b. Coercible a b => a -> b
coerce @_ @(t (em r' s') a) TransEventMonad t em r' s' a
go

-- | The kind of indexed monads aware of 'Event' instrumentation
--
-- See 'MonadEvent'.
type EventMonadKind = ReferenceKind -> SelectorKind -> FunctorKind

-- | The kind of 'Event' references
type ReferenceKind = Type

-- | The kind of 'Event' selectors
type SelectorKind = Type -> Type

-- | The kind of 'Functor's
type FunctorKind = Type -> Type