{-# LANGUAGE UndecidableInstances #-}

module Bowtie.Rewrite where

import Bowtie (Jot, pattern JotP)
import Control.Exception (Exception)
import Control.Monad ((>=>))
import Control.Monad.Except (ExceptT (..), MonadError (..), runExceptT)
import Control.Monad.IO.Class (MonadIO (..))
import Control.Monad.Identity (Identity (..))
import Control.Monad.Reader (MonadReader (..), ReaderT (..), asks)
import Control.Monad.State (MonadState (..))
import Control.Monad.Trans (MonadTrans (..))
import Data.Bitraversable (Bitraversable (..))
import Data.Sequence.NonEmpty (NESeq)
import Data.Sequence.NonEmpty qualified as NESeq
import Data.Typeable (Typeable)
import Data.Void (Void, absurd)

data AnnoErr k e = AnnoErr
  { forall k e. AnnoErr k e -> k
annoErrKey :: !k
  , forall k e. AnnoErr k e -> e
annoErrVal :: !e
  }
  deriving stock (AnnoErr k e -> AnnoErr k e -> Bool
(AnnoErr k e -> AnnoErr k e -> Bool)
-> (AnnoErr k e -> AnnoErr k e -> Bool) -> Eq (AnnoErr k e)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall k e. (Eq k, Eq e) => AnnoErr k e -> AnnoErr k e -> Bool
$c== :: forall k e. (Eq k, Eq e) => AnnoErr k e -> AnnoErr k e -> Bool
== :: AnnoErr k e -> AnnoErr k e -> Bool
$c/= :: forall k e. (Eq k, Eq e) => AnnoErr k e -> AnnoErr k e -> Bool
/= :: AnnoErr k e -> AnnoErr k e -> Bool
Eq, Eq (AnnoErr k e)
Eq (AnnoErr k e) =>
(AnnoErr k e -> AnnoErr k e -> Ordering)
-> (AnnoErr k e -> AnnoErr k e -> Bool)
-> (AnnoErr k e -> AnnoErr k e -> Bool)
-> (AnnoErr k e -> AnnoErr k e -> Bool)
-> (AnnoErr k e -> AnnoErr k e -> Bool)
-> (AnnoErr k e -> AnnoErr k e -> AnnoErr k e)
-> (AnnoErr k e -> AnnoErr k e -> AnnoErr k e)
-> Ord (AnnoErr k e)
AnnoErr k e -> AnnoErr k e -> Bool
AnnoErr k e -> AnnoErr k e -> Ordering
AnnoErr k e -> AnnoErr k e -> AnnoErr k e
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall k e. (Ord k, Ord e) => Eq (AnnoErr k e)
forall k e. (Ord k, Ord e) => AnnoErr k e -> AnnoErr k e -> Bool
forall k e.
(Ord k, Ord e) =>
AnnoErr k e -> AnnoErr k e -> Ordering
forall k e.
(Ord k, Ord e) =>
AnnoErr k e -> AnnoErr k e -> AnnoErr k e
$ccompare :: forall k e.
(Ord k, Ord e) =>
AnnoErr k e -> AnnoErr k e -> Ordering
compare :: AnnoErr k e -> AnnoErr k e -> Ordering
$c< :: forall k e. (Ord k, Ord e) => AnnoErr k e -> AnnoErr k e -> Bool
< :: AnnoErr k e -> AnnoErr k e -> Bool
$c<= :: forall k e. (Ord k, Ord e) => AnnoErr k e -> AnnoErr k e -> Bool
<= :: AnnoErr k e -> AnnoErr k e -> Bool
$c> :: forall k e. (Ord k, Ord e) => AnnoErr k e -> AnnoErr k e -> Bool
> :: AnnoErr k e -> AnnoErr k e -> Bool
$c>= :: forall k e. (Ord k, Ord e) => AnnoErr k e -> AnnoErr k e -> Bool
>= :: AnnoErr k e -> AnnoErr k e -> Bool
$cmax :: forall k e.
(Ord k, Ord e) =>
AnnoErr k e -> AnnoErr k e -> AnnoErr k e
max :: AnnoErr k e -> AnnoErr k e -> AnnoErr k e
$cmin :: forall k e.
(Ord k, Ord e) =>
AnnoErr k e -> AnnoErr k e -> AnnoErr k e
min :: AnnoErr k e -> AnnoErr k e -> AnnoErr k e
Ord, Int -> AnnoErr k e -> ShowS
[AnnoErr k e] -> ShowS
AnnoErr k e -> String
(Int -> AnnoErr k e -> ShowS)
-> (AnnoErr k e -> String)
-> ([AnnoErr k e] -> ShowS)
-> Show (AnnoErr k e)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall k e. (Show k, Show e) => Int -> AnnoErr k e -> ShowS
forall k e. (Show k, Show e) => [AnnoErr k e] -> ShowS
forall k e. (Show k, Show e) => AnnoErr k e -> String
$cshowsPrec :: forall k e. (Show k, Show e) => Int -> AnnoErr k e -> ShowS
showsPrec :: Int -> AnnoErr k e -> ShowS
$cshow :: forall k e. (Show k, Show e) => AnnoErr k e -> String
show :: AnnoErr k e -> String
$cshowList :: forall k e. (Show k, Show e) => [AnnoErr k e] -> ShowS
showList :: [AnnoErr k e] -> ShowS
Show)

instance
  (Show k, Typeable k, Show e, Typeable e)
  => Exception (AnnoErr k e)

unwrapAnnoErr :: Either (AnnoErr k Void) a -> a
unwrapAnnoErr :: forall k a. Either (AnnoErr k Void) a -> a
unwrapAnnoErr = (AnnoErr k Void -> a) -> (a -> a) -> Either (AnnoErr k Void) a -> a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (Void -> a
forall a. Void -> a
absurd (Void -> a) -> (AnnoErr k Void -> Void) -> AnnoErr k Void -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AnnoErr k Void -> Void
forall k e. AnnoErr k e -> e
annoErrVal) a -> a
forall a. a -> a
id

newtype RwT k e m a = RwT {forall k e (m :: * -> *) a.
RwT k e m a -> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a
unRwT :: ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a}
  deriving newtype ((forall a b. (a -> b) -> RwT k e m a -> RwT k e m b)
-> (forall a b. a -> RwT k e m b -> RwT k e m a)
-> Functor (RwT k e m)
forall a b. a -> RwT k e m b -> RwT k e m a
forall a b. (a -> b) -> RwT k e m a -> RwT k e m b
forall k e (m :: * -> *) a b.
Functor m =>
a -> RwT k e m b -> RwT k e m a
forall k e (m :: * -> *) a b.
Functor m =>
(a -> b) -> RwT k e m a -> RwT k e m b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall k e (m :: * -> *) a b.
Functor m =>
(a -> b) -> RwT k e m a -> RwT k e m b
fmap :: forall a b. (a -> b) -> RwT k e m a -> RwT k e m b
$c<$ :: forall k e (m :: * -> *) a b.
Functor m =>
a -> RwT k e m b -> RwT k e m a
<$ :: forall a b. a -> RwT k e m b -> RwT k e m a
Functor, Functor (RwT k e m)
Functor (RwT k e m) =>
(forall a. a -> RwT k e m a)
-> (forall a b. RwT k e m (a -> b) -> RwT k e m a -> RwT k e m b)
-> (forall a b c.
    (a -> b -> c) -> RwT k e m a -> RwT k e m b -> RwT k e m c)
-> (forall a b. RwT k e m a -> RwT k e m b -> RwT k e m b)
-> (forall a b. RwT k e m a -> RwT k e m b -> RwT k e m a)
-> Applicative (RwT k e m)
forall a. a -> RwT k e m a
forall a b. RwT k e m a -> RwT k e m b -> RwT k e m a
forall a b. RwT k e m a -> RwT k e m b -> RwT k e m b
forall a b. RwT k e m (a -> b) -> RwT k e m a -> RwT k e m b
forall a b c.
(a -> b -> c) -> RwT k e m a -> RwT k e m b -> RwT k e m c
forall k e (m :: * -> *). Monad m => Functor (RwT k e m)
forall k e (m :: * -> *) a. Monad m => a -> RwT k e m a
forall k e (m :: * -> *) a b.
Monad m =>
RwT k e m a -> RwT k e m b -> RwT k e m a
forall k e (m :: * -> *) a b.
Monad m =>
RwT k e m a -> RwT k e m b -> RwT k e m b
forall k e (m :: * -> *) a b.
Monad m =>
RwT k e m (a -> b) -> RwT k e m a -> RwT k e m b
forall k e (m :: * -> *) a b c.
Monad m =>
(a -> b -> c) -> RwT k e m a -> RwT k e m b -> RwT k e m c
forall (f :: * -> *).
Functor f =>
(forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
$cpure :: forall k e (m :: * -> *) a. Monad m => a -> RwT k e m a
pure :: forall a. a -> RwT k e m a
$c<*> :: forall k e (m :: * -> *) a b.
Monad m =>
RwT k e m (a -> b) -> RwT k e m a -> RwT k e m b
<*> :: forall a b. RwT k e m (a -> b) -> RwT k e m a -> RwT k e m b
$cliftA2 :: forall k e (m :: * -> *) a b c.
Monad m =>
(a -> b -> c) -> RwT k e m a -> RwT k e m b -> RwT k e m c
liftA2 :: forall a b c.
(a -> b -> c) -> RwT k e m a -> RwT k e m b -> RwT k e m c
$c*> :: forall k e (m :: * -> *) a b.
Monad m =>
RwT k e m a -> RwT k e m b -> RwT k e m b
*> :: forall a b. RwT k e m a -> RwT k e m b -> RwT k e m b
$c<* :: forall k e (m :: * -> *) a b.
Monad m =>
RwT k e m a -> RwT k e m b -> RwT k e m a
<* :: forall a b. RwT k e m a -> RwT k e m b -> RwT k e m a
Applicative, Applicative (RwT k e m)
Applicative (RwT k e m) =>
(forall a b. RwT k e m a -> (a -> RwT k e m b) -> RwT k e m b)
-> (forall a b. RwT k e m a -> RwT k e m b -> RwT k e m b)
-> (forall a. a -> RwT k e m a)
-> Monad (RwT k e m)
forall a. a -> RwT k e m a
forall a b. RwT k e m a -> RwT k e m b -> RwT k e m b
forall a b. RwT k e m a -> (a -> RwT k e m b) -> RwT k e m b
forall k e (m :: * -> *). Monad m => Applicative (RwT k e m)
forall k e (m :: * -> *) a. Monad m => a -> RwT k e m a
forall k e (m :: * -> *) a b.
Monad m =>
RwT k e m a -> RwT k e m b -> RwT k e m b
forall k e (m :: * -> *) a b.
Monad m =>
RwT k e m a -> (a -> RwT k e m b) -> RwT k e m b
forall (m :: * -> *).
Applicative m =>
(forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
$c>>= :: forall k e (m :: * -> *) a b.
Monad m =>
RwT k e m a -> (a -> RwT k e m b) -> RwT k e m b
>>= :: forall a b. RwT k e m a -> (a -> RwT k e m b) -> RwT k e m b
$c>> :: forall k e (m :: * -> *) a b.
Monad m =>
RwT k e m a -> RwT k e m b -> RwT k e m b
>> :: forall a b. RwT k e m a -> RwT k e m b -> RwT k e m b
$creturn :: forall k e (m :: * -> *) a. Monad m => a -> RwT k e m a
return :: forall a. a -> RwT k e m a
Monad)

type Rw k e = RwT k e Identity

instance MonadTrans (RwT k e) where
  lift :: forall (m :: * -> *) a. Monad m => m a -> RwT k e m a
lift = ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a -> RwT k e m a
forall k e (m :: * -> *) a.
ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a -> RwT k e m a
RwT (ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a -> RwT k e m a)
-> (m a -> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a)
-> m a
-> RwT k e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ExceptT (AnnoErr k e) m a
-> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a
forall (m :: * -> *) a. Monad m => m a -> ReaderT (NESeq k) m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (ExceptT (AnnoErr k e) m a
 -> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a)
-> (m a -> ExceptT (AnnoErr k e) m a)
-> m a
-> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m a -> ExceptT (AnnoErr k e) m a
forall (m :: * -> *) a. Monad m => m a -> ExceptT (AnnoErr k e) m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift

runRwT :: RwT k e m a -> k -> m (Either (AnnoErr k e) a)
runRwT :: forall k e (m :: * -> *) a.
RwT k e m a -> k -> m (Either (AnnoErr k e) a)
runRwT RwT k e m a
m = ExceptT (AnnoErr k e) m a -> m (Either (AnnoErr k e) a)
forall e (m :: * -> *) a. ExceptT e m a -> m (Either e a)
runExceptT (ExceptT (AnnoErr k e) m a -> m (Either (AnnoErr k e) a))
-> (k -> ExceptT (AnnoErr k e) m a)
-> k
-> m (Either (AnnoErr k e) a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a
-> NESeq k -> ExceptT (AnnoErr k e) m a
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT (RwT k e m a -> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a
forall k e (m :: * -> *) a.
RwT k e m a -> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a
unRwT RwT k e m a
m) (NESeq k -> ExceptT (AnnoErr k e) m a)
-> (k -> NESeq k) -> k -> ExceptT (AnnoErr k e) m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. k -> NESeq k
forall a. a -> NESeq a
NESeq.singleton

runRw :: Rw k e a -> k -> Either (AnnoErr k e) a
runRw :: forall k e a. Rw k e a -> k -> Either (AnnoErr k e) a
runRw Rw k e a
m = Identity (Either (AnnoErr k e) a) -> Either (AnnoErr k e) a
forall a. Identity a -> a
runIdentity (Identity (Either (AnnoErr k e) a) -> Either (AnnoErr k e) a)
-> (k -> Identity (Either (AnnoErr k e) a))
-> k
-> Either (AnnoErr k e) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rw k e a -> k -> Identity (Either (AnnoErr k e) a)
forall k e (m :: * -> *) a.
RwT k e m a -> k -> m (Either (AnnoErr k e) a)
runRwT Rw k e a
m

embedRwT :: m (Either (AnnoErr k e) a) -> RwT k e m a
embedRwT :: forall (m :: * -> *) k e a.
m (Either (AnnoErr k e) a) -> RwT k e m a
embedRwT m (Either (AnnoErr k e) a)
n = ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a -> RwT k e m a
forall k e (m :: * -> *) a.
ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a -> RwT k e m a
RwT ((NESeq k -> ExceptT (AnnoErr k e) m a)
-> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a
forall r (m :: * -> *) a. (r -> m a) -> ReaderT r m a
ReaderT (ExceptT (AnnoErr k e) m a -> NESeq k -> ExceptT (AnnoErr k e) m a
forall a b. a -> b -> a
const (m (Either (AnnoErr k e) a) -> ExceptT (AnnoErr k e) m a
forall e (m :: * -> *) a. m (Either e a) -> ExceptT e m a
ExceptT m (Either (AnnoErr k e) a)
n)))

embedRw :: Either (AnnoErr k e) a -> Rw k e a
embedRw :: forall k e a. Either (AnnoErr k e) a -> Rw k e a
embedRw = Identity (Either (AnnoErr k e) a) -> RwT k e Identity a
forall (m :: * -> *) k e a.
m (Either (AnnoErr k e) a) -> RwT k e m a
embedRwT (Identity (Either (AnnoErr k e) a) -> RwT k e Identity a)
-> (Either (AnnoErr k e) a -> Identity (Either (AnnoErr k e) a))
-> Either (AnnoErr k e) a
-> RwT k e Identity a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either (AnnoErr k e) a -> Identity (Either (AnnoErr k e) a)
forall a. a -> Identity a
Identity

pushRw :: (Monad m) => k -> RwT k e m a -> RwT k e m a
pushRw :: forall (m :: * -> *) k e a.
Monad m =>
k -> RwT k e m a -> RwT k e m a
pushRw k
b RwT k e m a
m = ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a -> RwT k e m a
forall k e (m :: * -> *) a.
ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a -> RwT k e m a
RwT ((NESeq k -> NESeq k)
-> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a
-> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a
forall a.
(NESeq k -> NESeq k)
-> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a
-> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local (NESeq k -> k -> NESeq k
forall a. NESeq a -> a -> NESeq a
NESeq.|> k
b) (RwT k e m a -> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a
forall k e (m :: * -> *) a.
RwT k e m a -> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a
unRwT RwT k e m a
m))

peekRw :: (Monad m) => RwT k e m k
peekRw :: forall (m :: * -> *) k e. Monad m => RwT k e m k
peekRw = ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) k -> RwT k e m k
forall k e (m :: * -> *) a.
ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a -> RwT k e m a
RwT ((NESeq k -> k) -> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) k
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks NESeq k -> k
forall a. NESeq a -> a
NESeq.last)

peeksRw :: (Monad m) => (k -> a) -> RwT k e m a
peeksRw :: forall (m :: * -> *) k a e. Monad m => (k -> a) -> RwT k e m a
peeksRw k -> a
f = ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a -> RwT k e m a
forall k e (m :: * -> *) a.
ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a -> RwT k e m a
RwT ((NESeq k -> a) -> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks (k -> a
f (k -> a) -> (NESeq k -> k) -> NESeq k -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NESeq k -> k
forall a. NESeq a -> a
NESeq.last))

askRw :: (Monad m) => RwT k e m (NESeq k)
askRw :: forall (m :: * -> *) k e. Monad m => RwT k e m (NESeq k)
askRw = ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) (NESeq k)
-> RwT k e m (NESeq k)
forall k e (m :: * -> *) a.
ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a -> RwT k e m a
RwT ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) (NESeq k)
forall r (m :: * -> *). MonadReader r m => m r
ask

asksRw :: (Monad m) => (NESeq k -> a) -> RwT k e m a
asksRw :: forall (m :: * -> *) k a e.
Monad m =>
(NESeq k -> a) -> RwT k e m a
asksRw NESeq k -> a
f = ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a -> RwT k e m a
forall k e (m :: * -> *) a.
ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a -> RwT k e m a
RwT ((NESeq k -> a) -> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks NESeq k -> a
f)

throwRw :: (Monad m) => e -> RwT k e m a
throwRw :: forall (m :: * -> *) e k a. Monad m => e -> RwT k e m a
throwRw e
e = ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a -> RwT k e m a
forall k e (m :: * -> *) a.
ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a -> RwT k e m a
RwT ((NESeq k -> k) -> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) k
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks NESeq k -> k
forall a. NESeq a -> a
NESeq.last ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) k
-> (k -> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a)
-> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a
forall a b.
ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a
-> (a -> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) b)
-> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \k
b -> AnnoErr k e -> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a
forall a.
AnnoErr k e -> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (k -> e -> AnnoErr k e
forall k e. k -> e -> AnnoErr k e
AnnoErr k
b e
e))

instance (MonadReader r m) => MonadReader r (RwT k e m) where
  ask :: RwT k e m r
ask = m r -> RwT k e m r
forall (m :: * -> *) a. Monad m => m a -> RwT k e m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m r
forall r (m :: * -> *). MonadReader r m => m r
ask
  reader :: forall a. (r -> a) -> RwT k e m a
reader r -> a
f = m a -> RwT k e m a
forall (m :: * -> *) a. Monad m => m a -> RwT k e m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((r -> a) -> m a
forall a. (r -> a) -> m a
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader r -> a
f)
  local :: forall a. (r -> r) -> RwT k e m a -> RwT k e m a
local r -> r
f RwT k e m a
m = ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a -> RwT k e m a
forall k e (m :: * -> *) a.
ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a -> RwT k e m a
RwT (ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a -> RwT k e m a)
-> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a -> RwT k e m a
forall a b. (a -> b) -> a -> b
$ do
    NESeq k
bs <- ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) (NESeq k)
forall r (m :: * -> *). MonadReader r m => m r
ask
    Either (AnnoErr k e) a
ea <- ExceptT (AnnoErr k e) m (Either (AnnoErr k e) a)
-> ReaderT
     (NESeq k) (ExceptT (AnnoErr k e) m) (Either (AnnoErr k e) a)
forall (m :: * -> *) a. Monad m => m a -> ReaderT (NESeq k) m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (Either (AnnoErr k e) a)
-> ExceptT (AnnoErr k e) m (Either (AnnoErr k e) a)
forall (m :: * -> *) a. Monad m => m a -> ExceptT (AnnoErr k e) m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((r -> r)
-> m (Either (AnnoErr k e) a) -> m (Either (AnnoErr k e) a)
forall a. (r -> r) -> m a -> m a
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local r -> r
f (ExceptT (AnnoErr k e) m a -> m (Either (AnnoErr k e) a)
forall e (m :: * -> *) a. ExceptT e m a -> m (Either e a)
runExceptT (ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a
-> NESeq k -> ExceptT (AnnoErr k e) m a
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT (RwT k e m a -> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a
forall k e (m :: * -> *) a.
RwT k e m a -> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a
unRwT RwT k e m a
m) NESeq k
bs))))
    (AnnoErr k e -> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a)
-> (a -> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a)
-> Either (AnnoErr k e) a
-> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either AnnoErr k e -> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a
forall a.
AnnoErr k e -> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError a -> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a
forall a. a -> ReaderT (NESeq k) (ExceptT (AnnoErr k e) m) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Either (AnnoErr k e) a
ea

instance (MonadState s m) => MonadState s (RwT k e m) where
  get :: RwT k e m s
get = m s -> RwT k e m s
forall (m :: * -> *) a. Monad m => m a -> RwT k e m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m s
forall s (m :: * -> *). MonadState s m => m s
get
  put :: s -> RwT k e m ()
put = m () -> RwT k e m ()
forall (m :: * -> *) a. Monad m => m a -> RwT k e m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> RwT k e m ()) -> (s -> m ()) -> s -> RwT k e m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. s -> m ()
forall s (m :: * -> *). MonadState s m => s -> m ()
put
  state :: forall a. (s -> (a, s)) -> RwT k e m a
state s -> (a, s)
f = m a -> RwT k e m a
forall (m :: * -> *) a. Monad m => m a -> RwT k e m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((s -> (a, s)) -> m a
forall a. (s -> (a, s)) -> m a
forall s (m :: * -> *) a. MonadState s m => (s -> (a, s)) -> m a
state s -> (a, s)
f)

instance (MonadIO m) => MonadIO (RwT k e m) where
  liftIO :: forall a. IO a -> RwT k e m a
liftIO = m a -> RwT k e m a
forall (m :: * -> *) a. Monad m => m a -> RwT k e m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> RwT k e m a) -> (IO a -> m a) -> IO a -> RwT k e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO a -> m a
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO

wrapRw :: g a (Jot g k a) -> Rw k e (Jot g k a)
wrapRw :: forall (g :: * -> * -> *) a k e.
g a (Jot g k a) -> Rw k e (Jot g k a)
wrapRw = (k -> Jot g k a) -> RwT k e Identity (Jot g k a)
forall (m :: * -> *) k a e. Monad m => (k -> a) -> RwT k e m a
peeksRw ((k -> Jot g k a) -> RwT k e Identity (Jot g k a))
-> (g a (Jot g k a) -> k -> Jot g k a)
-> g a (Jot g k a)
-> RwT k e Identity (Jot g k a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (k -> g a (Jot g k a) -> Jot g k a)
-> g a (Jot g k a) -> k -> Jot g k a
forall a b c. (a -> b -> c) -> b -> a -> c
flip k -> g a (Jot g k a) -> Jot g k a
forall k (g :: * -> * -> *) a. k -> g a (Jot g k a) -> Jot g k a
JotP

jotRw :: (Bitraversable g) => (g a z -> Rw k e z) -> Jot g k a -> Either (AnnoErr k e) z
jotRw :: forall (g :: * -> * -> *) a z k e.
Bitraversable g =>
(g a z -> Rw k e z) -> Jot g k a -> Either (AnnoErr k e) z
jotRw g a z -> Rw k e z
f = Identity (Either (AnnoErr k e) z) -> Either (AnnoErr k e) z
forall a. Identity a -> a
runIdentity (Identity (Either (AnnoErr k e) z) -> Either (AnnoErr k e) z)
-> (Jot g k a -> Identity (Either (AnnoErr k e) z))
-> Jot g k a
-> Either (AnnoErr k e) z
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (g a (Rw k e z) -> Rw k e z)
-> Jot g k a -> Identity (Either (AnnoErr k e) z)
forall (m :: * -> *) (g :: * -> * -> *) a k e z.
(Monad m, Bitraversable g) =>
(g a (RwT k e m z) -> RwT k e m z)
-> Jot g k a -> m (Either (AnnoErr k e) z)
jotRwT ((a -> RwT k e Identity a)
-> (Rw k e z -> Rw k e z)
-> g a (Rw k e z)
-> RwT k e Identity (g a z)
forall (f :: * -> *) a c b d.
Applicative f =>
(a -> f c) -> (b -> f d) -> g a b -> f (g c d)
forall (t :: * -> * -> *) (f :: * -> *) a c b d.
(Bitraversable t, Applicative f) =>
(a -> f c) -> (b -> f d) -> t a b -> f (t c d)
bitraverse a -> RwT k e Identity a
forall a. a -> RwT k e Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Rw k e z -> Rw k e z
forall a. a -> a
id (g a (Rw k e z) -> RwT k e Identity (g a z))
-> (g a z -> Rw k e z) -> g a (Rw k e z) -> Rw k e z
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> g a z -> Rw k e z
f)

jotRwT :: (Monad m, Bitraversable g) => (g a (RwT k e m z) -> RwT k e m z) -> Jot g k a -> m (Either (AnnoErr k e) z)
jotRwT :: forall (m :: * -> *) (g :: * -> * -> *) a k e z.
(Monad m, Bitraversable g) =>
(g a (RwT k e m z) -> RwT k e m z)
-> Jot g k a -> m (Either (AnnoErr k e) z)
jotRwT g a (RwT k e m z) -> RwT k e m z
f j0 :: Jot g k a
j0@(JotP k
b0 g a (Jot g k a)
_) = RwT k e m z -> k -> m (Either (AnnoErr k e) z)
forall k e (m :: * -> *) a.
RwT k e m a -> k -> m (Either (AnnoErr k e) a)
runRwT (Jot g k a -> RwT k e m z
go Jot g k a
j0) k
b0 where go :: Jot g k a -> RwT k e m z
go (JotP k
b g a (Jot g k a)
g) = k -> RwT k e m z -> RwT k e m z
forall (m :: * -> *) k e a.
Monad m =>
k -> RwT k e m a -> RwT k e m a
pushRw k
b (g a (RwT k e m z) -> RwT k e m z
f ((Jot g k a -> RwT k e m z) -> g a (Jot g k a) -> g a (RwT k e m z)
forall a b. (a -> b) -> g a a -> g a b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Jot g k a -> RwT k e m z
go g a (Jot g k a)
g))