{-# OPTIONS_GHC -Wall #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE NoImplicitPrelude #-}

module Control.Monad.State.Profunctor.IxState(
  IxStateT(..)
, IxState
, ixState
, swap
, module I
) where

import Control.Applicative
    ( Applicative((<*>), pure), Alternative((<|>), empty) )
import Control.Arrow
    ( Arrow(arr, first), ArrowApply(..), ArrowChoice(left) )
import Control.Category ( Category(..) )
import Control.Lens
    ( Choice(..),
      Profunctor(dimap),
      view,
      iso,
      over,
      _Wrapped,
      Field1(_1),
      Field2(_2),
      Iso,
      Rewrapped,
      Wrapped(..) )
import Control.Monad
    ( Monad(return, (>>=)), Functor(..), (>=>) )
import Control.Monad.Cont ( MonadCont(..) )
import Control.Monad.Error.Class ( MonadError(..) )
import Control.Monad.Fix ( MonadFix(..) )
import Control.Monad.IO.Class ( MonadIO(..) )
import Control.Monad.Reader.Class ( MonadReader(..) )
import Control.Monad.State.Class ( MonadState(..) )
import Control.Monad.State.Profunctor.Class as I
    ( IxMonadState(iget, iput, istate),
      IxAlternative(..),
      IxAlt(..),
      IxMonad,
      IxBind(..),
      IxApplicative(..),
      IxApply(..),
      IxFunctor(..),
      IxMonadFix(..),
      IxMonadCont(..),
      IxBindTrans(..),
      IxMonadTrans(..) )
import Control.Monad.Writer.Class
    ( MonadWriter(writer, listen, pass) )
import Data.Either ( Either(Right, Left), either )
import Data.Functor.Alt ( Alt((<!>)) )
import Data.Functor.Apply ( Apply(liftF2, (<.>)) )
import Data.Functor.Bind ( Bind((>>-)), (->-) )
import Data.Functor.Identity as I ( Identity(..) )
import Data.Monoid ( (<>), Monoid(mempty) )
import Data.Profunctor as I ( Strong(..) )
import Data.Semigroup ( Semigroup )
import Data.Semigroupoid ( Semigroupoid(..) )

newtype IxStateT f t s a =
  IxStateT (s -> f (a, t))

type IxState t s a =
  IxStateT Identity t s a

ixState ::
  Iso
    (IxState t s a)
    (IxState t' s' a')
    (s -> (a, t))
    (s' -> (a', t'))
ixState :: forall t s a t' s' a' (p :: * -> * -> *) (f :: * -> *).
(Profunctor p, Functor f) =>
p (s -> (a, t)) (f (s' -> (a', t')))
-> p (IxState t s a) (f (IxState t' s' a'))
ixState =
  (IxState t s a -> s -> (a, t))
-> ((s' -> (a', t')) -> IxState t' s' a')
-> Iso
     (IxState t s a) (IxState t' s' a') (s -> (a, t)) (s' -> (a', t'))
forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso
    (\(IxStateT s -> Identity (a, t)
f) -> Identity (a, t) -> (a, t)
forall a. Identity a -> a
runIdentity (Identity (a, t) -> (a, t))
-> (s -> Identity (a, t)) -> s -> (a, t)
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. s -> Identity (a, t)
f)
    (\s' -> (a', t')
f -> (s' -> Identity (a', t')) -> IxState t' s' a'
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT ((a', t') -> Identity (a', t')
forall a. a -> Identity a
Identity ((a', t') -> Identity (a', t'))
-> (s' -> (a', t')) -> s' -> Identity (a', t')
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. s' -> (a', t')
f))

swap ::
  (Functor f, Functor f') =>
  Iso
    (IxStateT f t s a)
    (IxStateT f' t' s' a')
    (IxStateT f a s t)
    (IxStateT f' a' s' t')
swap :: forall (f :: * -> *) (f' :: * -> *) t s a t' s' a'.
(Functor f, Functor f') =>
Iso
  (IxStateT f t s a)
  (IxStateT f' t' s' a')
  (IxStateT f a s t)
  (IxStateT f' a' s' t')
swap =
  (IxStateT f t s a -> IxStateT f a s t)
-> (IxStateT f' a' s' t' -> IxStateT f' t' s' a')
-> Iso
     (IxStateT f t s a)
     (IxStateT f' t' s' a')
     (IxStateT f a s t)
     (IxStateT f' a' s' t')
forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso
    (ASetter
  (IxStateT f t s a)
  (IxStateT f a s t)
  (s -> f (a, t))
  (s -> f (t, a))
-> ((s -> f (a, t)) -> s -> f (t, a))
-> IxStateT f t s a
-> IxStateT f a s t
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over (Unwrapped (IxStateT f t s a)
 -> Identity (Unwrapped (IxStateT f a s t)))
-> IxStateT f t s a -> Identity (IxStateT f a s t)
ASetter
  (IxStateT f t s a)
  (IxStateT f a s t)
  (s -> f (a, t))
  (s -> f (t, a))
forall s t. Rewrapping s t => Iso s t (Unwrapped s) (Unwrapped t)
Iso
  (IxStateT f t s a)
  (IxStateT f a s t)
  (Unwrapped (IxStateT f t s a))
  (Unwrapped (IxStateT f a s t))
_Wrapped (\s -> f (a, t)
f s
s -> ((a, t) -> (t, a)) -> f (a, t) -> f (t, a)
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(a
a, t
t) -> (t
t, a
a)) (s -> f (a, t)
f s
s)))
    (ASetter
  (IxStateT f' a' s' t')
  (IxStateT f' t' s' a')
  (s' -> f' (t', a'))
  (s' -> f' (a', t'))
-> ((s' -> f' (t', a')) -> s' -> f' (a', t'))
-> IxStateT f' a' s' t'
-> IxStateT f' t' s' a'
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over (Unwrapped (IxStateT f' a' s' t')
 -> Identity (Unwrapped (IxStateT f' t' s' a')))
-> IxStateT f' a' s' t' -> Identity (IxStateT f' t' s' a')
ASetter
  (IxStateT f' a' s' t')
  (IxStateT f' t' s' a')
  (s' -> f' (t', a'))
  (s' -> f' (a', t'))
forall s t. Rewrapping s t => Iso s t (Unwrapped s) (Unwrapped t)
Iso
  (IxStateT f' a' s' t')
  (IxStateT f' t' s' a')
  (Unwrapped (IxStateT f' a' s' t'))
  (Unwrapped (IxStateT f' t' s' a'))
_Wrapped (\s' -> f' (t', a')
f s'
s -> ((t', a') -> (a', t')) -> f' (t', a') -> f' (a', t')
forall a b. (a -> b) -> f' a -> f' b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(t'
t, a'
a) -> (a'
a, t'
t)) (s' -> f' (t', a')
f s'
s)))

instance IxStateT f t s a ~ x =>
  Rewrapped (IxStateT f' t' s' a') x

instance Wrapped (IxStateT f t s a) where
  type Unwrapped (IxStateT f t s a) =
    s -> f (a, t)
  _Wrapped' :: Iso' (IxStateT f t s a) (Unwrapped (IxStateT f t s a))
_Wrapped' =
    (IxStateT f t s a -> s -> f (a, t))
-> ((s -> f (a, t)) -> IxStateT f t s a)
-> Iso
     (IxStateT f t s a)
     (IxStateT f t s a)
     (s -> f (a, t))
     (s -> f (a, t))
forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso (\(IxStateT s -> f (a, t)
x) -> s -> f (a, t)
x) (s -> f (a, t)) -> IxStateT f t s a
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT

instance (Apply f, Semigroup a, Semigroup t) => Semigroup (IxStateT f t s a) where
  IxStateT s -> f (a, t)
f <> :: IxStateT f t s a -> IxStateT f t s a -> IxStateT f t s a
<> IxStateT s -> f (a, t)
g =
    (s -> f (a, t)) -> IxStateT f t s a
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT (\s
s -> ((a, t) -> (a, t) -> (a, t)) -> f (a, t) -> f (a, t) -> f (a, t)
forall a b c. (a -> b -> c) -> f a -> f b -> f c
forall (f :: * -> *) a b c.
Apply f =>
(a -> b -> c) -> f a -> f b -> f c
liftF2 (a, t) -> (a, t) -> (a, t)
forall a. Semigroup a => a -> a -> a
(<>) (s -> f (a, t)
f s
s) (s -> f (a, t)
g s
s))

instance (Applicative f, Apply f, Monoid a, Monoid t) => Monoid (IxStateT f t s a) where
  mempty :: IxStateT f t s a
mempty =
    (s -> f (a, t)) -> IxStateT f t s a
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT (f (a, t) -> s -> f (a, t)
forall a. a -> s -> a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((a, t) -> f (a, t)
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a
forall a. Monoid a => a
mempty, t
forall a. Monoid a => a
mempty)))

instance Functor f => Functor (IxStateT f t s) where
  fmap :: forall a b. (a -> b) -> IxStateT f t s a -> IxStateT f t s b
fmap =
    (a -> b) -> IxStateT f t s a -> IxStateT f t s b
forall a b j k. (a -> b) -> IxStateT f j k a -> IxStateT f j k b
forall (f :: * -> * -> * -> *) a b j k.
IxFunctor f =>
(a -> b) -> f j k a -> f j k b
($.$)

instance Functor f => IxFunctor (IxStateT f) where
  a -> b
f $.$ :: forall a b j k. (a -> b) -> IxStateT f j k a -> IxStateT f j k b
$.$ IxStateT k -> f (a, j)
g =
    (k -> f (b, j)) -> IxStateT f j k b
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT (((a, j) -> (b, j)) -> f (a, j) -> f (b, j)
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (ASetter (a, j) (b, j) a b -> (a -> b) -> (a, j) -> (b, j)
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over ASetter (a, j) (b, j) a b
forall s t a b. Field1 s t a b => Lens s t a b
Lens (a, j) (b, j) a b
_1 a -> b
f) (f (a, j) -> f (b, j)) -> (k -> f (a, j)) -> k -> f (b, j)
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. k -> f (a, j)
g)

instance Monad f => Apply (IxStateT f s s) where
  <.> :: forall a b.
IxStateT f s s (a -> b) -> IxStateT f s s a -> IxStateT f s s b
(<.>) =
    IxStateT f s s (a -> b) -> IxStateT f s s a -> IxStateT f s s b
forall j k a b i.
IxStateT f j k (a -> b) -> IxStateT f i j a -> IxStateT f i k b
forall (f :: * -> * -> * -> *) j k a b i.
IxApply f =>
f j k (a -> b) -> f i j a -> f i k b
(<*.*>)

instance Monad f => IxApply (IxStateT f) where
  IxStateT f j k (a -> b)
f <*.*> :: forall j k a b i.
IxStateT f j k (a -> b) -> IxStateT f i j a -> IxStateT f i k b
<*.*> IxStateT f i j a
a =
    ((a -> b) -> IxStateT f i j b)
-> IxStateT f j k (a -> b) -> IxStateT f i k b
forall a i j b k.
(a -> IxStateT f i j b) -> IxStateT f j k a -> IxStateT f i k b
forall (f :: * -> * -> * -> *) a i j b k.
IxBind f =>
(a -> f i j b) -> f j k a -> f i k b
(-<<<) ((a -> b) -> IxStateT f i j a -> IxStateT f i j b
forall a b j k. (a -> b) -> IxStateT f j k a -> IxStateT f j k b
forall (f :: * -> * -> * -> *) a b j k.
IxFunctor f =>
(a -> b) -> f j k a -> f j k b
$.$ IxStateT f i j a
a) IxStateT f j k (a -> b)
f

instance Monad f => Applicative (IxStateT f s s) where
  pure :: forall a. a -> IxStateT f s s a
pure =
    a -> IxStateT f s s a
forall a i. a -> IxStateT f i i a
forall (f :: * -> * -> * -> *) a i. IxApplicative f => a -> f i i a
ipure
  <*> :: forall a b.
IxStateT f s s (a -> b) -> IxStateT f s s a -> IxStateT f s s b
(<*>) =
    IxStateT f s s (a -> b) -> IxStateT f s s a -> IxStateT f s s b
forall j k a b i.
IxStateT f j k (a -> b) -> IxStateT f i j a -> IxStateT f i k b
forall (f :: * -> * -> * -> *) j k a b i.
IxApply f =>
f j k (a -> b) -> f i j a -> f i k b
(<*.*>)

instance Monad f => IxApplicative (IxStateT f) where
  ipure :: forall a i. a -> IxStateT f i i a
ipure a
a =
    (i -> f (a, i)) -> IxStateT f i i a
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT (\i
s -> (a, i) -> f (a, i)
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a
a, i
s))

instance Monad f => Bind (IxStateT f s s) where
  >>- :: forall a b.
IxStateT f s s a -> (a -> IxStateT f s s b) -> IxStateT f s s b
(>>-) =
    IxStateT f s s a -> (a -> IxStateT f s s b) -> IxStateT f s s b
forall j k a i b.
IxStateT f j k a -> (a -> IxStateT f i j b) -> IxStateT f i k b
forall (f :: * -> * -> * -> *) j k a i b.
IxBind f =>
f j k a -> (a -> f i j b) -> f i k b
(>>>-)

instance Monad f => IxBind (IxStateT f) where
  a -> IxStateT f i j b
g -<<< :: forall a i j b k.
(a -> IxStateT f i j b) -> IxStateT f j k a -> IxStateT f i k b
-<<< (IxStateT k -> f (a, j)
f) =
    (k -> f (b, i)) -> IxStateT f i k b
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT (k -> f (a, j)
f (k -> f (a, j)) -> ((a, j) -> f (b, i)) -> k -> f (b, i)
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> (\ ~(a
a', j
t') -> Getting (j -> f (b, i)) (IxStateT f i j b) (j -> f (b, i))
-> IxStateT f i j b -> j -> f (b, i)
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view (Unwrapped (IxStateT f i j b)
 -> Const (j -> f (b, i)) (Unwrapped (IxStateT f i j b)))
-> IxStateT f i j b -> Const (j -> f (b, i)) (IxStateT f i j b)
Getting (j -> f (b, i)) (IxStateT f i j b) (j -> f (b, i))
forall s t. Rewrapping s t => Iso s t (Unwrapped s) (Unwrapped t)
Iso
  (IxStateT f i j b)
  (IxStateT f i j b)
  (Unwrapped (IxStateT f i j b))
  (Unwrapped (IxStateT f i j b))
_Wrapped (a -> IxStateT f i j b
g a
a') j
t'))

instance Monad f => Monad (IxStateT f s s) where
  return :: forall a. a -> IxStateT f s s a
return =
    a -> IxStateT f s s a
forall a i. a -> IxStateT f i i a
forall (f :: * -> * -> * -> *) a i. IxApplicative f => a -> f i i a
ipure
  >>= :: forall a b.
IxStateT f s s a -> (a -> IxStateT f s s b) -> IxStateT f s s b
(>>=) =
    IxStateT f s s a -> (a -> IxStateT f s s b) -> IxStateT f s s b
forall j k a i b.
IxStateT f j k a -> (a -> IxStateT f i j b) -> IxStateT f i k b
forall (f :: * -> * -> * -> *) j k a i b.
IxBind f =>
f j k a -> (a -> f i j b) -> f i k b
(>>>-)

instance Monad f => IxMonad (IxStateT f) where

instance Alt f => Alt (IxStateT f s s) where
  <!> :: forall a. IxStateT f s s a -> IxStateT f s s a -> IxStateT f s s a
(<!>) =
    IxStateT f s s a -> IxStateT f s s a -> IxStateT f s s a
forall i j a.
IxStateT f i j a -> IxStateT f i j a -> IxStateT f i j a
forall (f :: * -> * -> * -> *) i j a.
IxAlt f =>
f i j a -> f i j a -> f i j a
(<|.|>)

instance Alt f => IxAlt (IxStateT f) where
  IxStateT j -> f (a, i)
f <|.|> :: forall i j a.
IxStateT f i j a -> IxStateT f i j a -> IxStateT f i j a
<|.|> IxStateT j -> f (a, i)
g =
    (j -> f (a, i)) -> IxStateT f i j a
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT (\j
s -> j -> f (a, i)
f j
s f (a, i) -> f (a, i) -> f (a, i)
forall a. f a -> f a -> f a
forall (f :: * -> *) a. Alt f => f a -> f a -> f a
<!> j -> f (a, i)
g j
s)

instance (Alternative f, Monad f) => Alternative (IxStateT f s s) where
  IxStateT s -> f (a, s)
f <|> :: forall a. IxStateT f s s a -> IxStateT f s s a -> IxStateT f s s a
<|> IxStateT s -> f (a, s)
g =
    (s -> f (a, s)) -> IxStateT f s s a
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT (\s
s -> s -> f (a, s)
f s
s f (a, s) -> f (a, s) -> f (a, s)
forall a. f a -> f a -> f a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> s -> f (a, s)
g s
s)
  empty :: forall a. IxStateT f s s a
empty =
    (s -> f (a, s)) -> IxStateT f s s a
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT (f (a, s) -> s -> f (a, s)
forall a. a -> s -> a
forall (f :: * -> *) a. Applicative f => a -> f a
pure f (a, s)
forall a. f a
forall (f :: * -> *) a. Alternative f => f a
empty)

instance (Alt f, Alternative f) => IxAlternative (IxStateT f) where
  iempty :: forall i j a. IxStateT f i j a
iempty =
    (j -> f (a, i)) -> IxStateT f i j a
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT (f (a, i) -> j -> f (a, i)
forall a. a -> j -> a
forall (f :: * -> *) a. Applicative f => a -> f a
pure f (a, i)
forall a. f a
forall (f :: * -> *) a. Alternative f => f a
empty)

instance Monad f => MonadState s (IxStateT f s s) where
  state :: forall a. (s -> (a, s)) -> IxStateT f s s a
state =
    (s -> (a, s)) -> IxStateT f s s a
forall s a t. (s -> (a, t)) -> IxStateT f t s a
forall (f :: * -> * -> * -> *) s a t.
IxMonadState f =>
(s -> (a, t)) -> f t s a
istate
  get :: IxStateT f s s s
get =
    IxStateT f s s s
forall t. IxStateT f t t t
forall (f :: * -> * -> * -> *) t. IxMonadState f => f t t t
iget
  put :: s -> IxStateT f s s ()
put =
    s -> IxStateT f s s ()
forall t s. t -> IxStateT f t s ()
forall (f :: * -> * -> * -> *) t s. IxMonadState f => t -> f t s ()
iput

instance Monad f => IxMonadState (IxStateT f) where
  iget :: forall t. IxStateT f t t t
iget =
    (t -> f (t, t)) -> IxStateT f t t t
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT (\t
s -> (t, t) -> f (t, t)
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (t
s, t
s))
  iput :: forall t s. t -> IxStateT f t s ()
iput t
a =
    (s -> f ((), t)) -> IxStateT f t s ()
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT (\s
_ -> ((), t) -> f ((), t)
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((), t
a))
  istate :: forall s a t. (s -> (a, t)) -> IxStateT f t s a
istate s -> (a, t)
f =
    (s -> f (a, t)) -> IxStateT f t s a
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT ((a, t) -> f (a, t)
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((a, t) -> f (a, t)) -> (s -> (a, t)) -> s -> f (a, t)
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. s -> (a, t)
f)

instance MonadReader r f => MonadReader r (IxStateT f s s) where
  ask :: IxStateT f s s r
ask =
    f r -> IxStateT f s s r
forall (f :: * -> *) a s. Monad f => f a -> IxStateT f s s a
forall (g :: (* -> *) -> * -> * -> * -> *) (f :: * -> *) a s.
(IxMonadTrans g, Monad f) =>
f a -> g f s s a
ilift f r
forall r (m :: * -> *). MonadReader r m => m r
ask
  reader :: forall a. (r -> a) -> IxStateT f s s a
reader =
    f a -> IxStateT f s s a
forall (f :: * -> *) a s. Monad f => f a -> IxStateT f s s a
forall (g :: (* -> *) -> * -> * -> * -> *) (f :: * -> *) a s.
(IxMonadTrans g, Monad f) =>
f a -> g f s s a
ilift (f a -> IxStateT f s s a)
-> ((r -> a) -> f a) -> (r -> a) -> IxStateT f s s a
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (r -> a) -> f a
forall a. (r -> a) -> f a
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader
  local :: forall a. (r -> r) -> IxStateT f s s a -> IxStateT f s s a
local r -> r
f (IxStateT s -> f (a, s)
g) =
    (s -> f (a, s)) -> IxStateT f s s a
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT ((r -> r) -> f (a, s) -> f (a, s)
forall a. (r -> r) -> f a -> f a
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local r -> r
f (f (a, s) -> f (a, s)) -> (s -> f (a, s)) -> s -> f (a, s)
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. s -> f (a, s)
g)

instance MonadWriter r f => MonadWriter r (IxStateT f s s) where
  writer :: forall a. (a, r) -> IxStateT f s s a
writer =
    f a -> IxStateT f s s a
forall (f :: * -> *) a s. Monad f => f a -> IxStateT f s s a
forall (g :: (* -> *) -> * -> * -> * -> *) (f :: * -> *) a s.
(IxMonadTrans g, Monad f) =>
f a -> g f s s a
ilift (f a -> IxStateT f s s a)
-> ((a, r) -> f a) -> (a, r) -> IxStateT f s s a
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (a, r) -> f a
forall a. (a, r) -> f a
forall w (m :: * -> *) a. MonadWriter w m => (a, w) -> m a
writer
  listen :: forall a. IxStateT f s s a -> IxStateT f s s (a, r)
listen =
    ASetter
  (IxStateT f s s a)
  (IxStateT f s s (a, r))
  (s -> f (a, s))
  (s -> f ((a, r), s))
-> ((s -> f (a, s)) -> s -> f ((a, r), s))
-> IxStateT f s s a
-> IxStateT f s s (a, r)
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over (Unwrapped (IxStateT f s s a)
 -> Identity (Unwrapped (IxStateT f s s (a, r))))
-> IxStateT f s s a -> Identity (IxStateT f s s (a, r))
ASetter
  (IxStateT f s s a)
  (IxStateT f s s (a, r))
  (s -> f (a, s))
  (s -> f ((a, r), s))
forall s t. Rewrapping s t => Iso s t (Unwrapped s) (Unwrapped t)
Iso
  (IxStateT f s s a)
  (IxStateT f s s (a, r))
  (Unwrapped (IxStateT f s s a))
  (Unwrapped (IxStateT f s s (a, r)))
_Wrapped (\s -> f (a, s)
f s
s -> (((a, s), r) -> ((a, r), s)) -> f ((a, s), r) -> f ((a, r), s)
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\((a
a, s
t), r
r) -> ((a
a, r
r), s
t)) (f (a, s) -> f ((a, s), r)
forall a. f a -> f (a, r)
forall w (m :: * -> *) a. MonadWriter w m => m a -> m (a, w)
listen (s -> f (a, s)
f s
s)))
  pass :: forall a. IxStateT f s s (a, r -> r) -> IxStateT f s s a
pass =
    ASetter
  (IxStateT f s s (a, r -> r))
  (IxStateT f s s a)
  (s -> f ((a, r -> r), s))
  (s -> f (a, s))
-> ((s -> f ((a, r -> r), s)) -> s -> f (a, s))
-> IxStateT f s s (a, r -> r)
-> IxStateT f s s a
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over (Unwrapped (IxStateT f s s (a, r -> r))
 -> Identity (Unwrapped (IxStateT f s s a)))
-> IxStateT f s s (a, r -> r) -> Identity (IxStateT f s s a)
ASetter
  (IxStateT f s s (a, r -> r))
  (IxStateT f s s a)
  (s -> f ((a, r -> r), s))
  (s -> f (a, s))
forall s t. Rewrapping s t => Iso s t (Unwrapped s) (Unwrapped t)
Iso
  (IxStateT f s s (a, r -> r))
  (IxStateT f s s a)
  (Unwrapped (IxStateT f s s (a, r -> r)))
  (Unwrapped (IxStateT f s s a))
_Wrapped (\s -> f ((a, r -> r), s)
f s
s -> f ((a, s), r -> r) -> f (a, s)
forall a. f (a, r -> r) -> f a
forall w (m :: * -> *) a. MonadWriter w m => m (a, w -> w) -> m a
pass ((((a, r -> r), s) -> ((a, s), r -> r))
-> f ((a, r -> r), s) -> f ((a, s), r -> r)
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\((a
a, r -> r
k), s
t) -> ((a
a, s
t), r -> r
k)) (s -> f ((a, r -> r), s)
f s
s)))

instance MonadError r f => MonadError r (IxStateT f s s) where
  throwError :: forall a. r -> IxStateT f s s a
throwError =
    f a -> IxStateT f s s a
forall (f :: * -> *) a s. Monad f => f a -> IxStateT f s s a
forall (g :: (* -> *) -> * -> * -> * -> *) (f :: * -> *) a s.
(IxMonadTrans g, Monad f) =>
f a -> g f s s a
ilift (f a -> IxStateT f s s a) -> (r -> f a) -> r -> IxStateT f s s a
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. r -> f a
forall a. r -> f a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError
  catchError :: forall a.
IxStateT f s s a -> (r -> IxStateT f s s a) -> IxStateT f s s a
catchError (IxStateT s -> f (a, s)
f) r -> IxStateT f s s a
g =
    (s -> f (a, s)) -> IxStateT f s s a
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT (\s
s -> f (a, s) -> (r -> f (a, s)) -> f (a, s)
forall a. f a -> (r -> f a) -> f a
forall e (m :: * -> *) a.
MonadError e m =>
m a -> (e -> m a) -> m a
catchError (s -> f (a, s)
f s
s) (\r
r -> Getting (s -> f (a, s)) (IxStateT f s s a) (s -> f (a, s))
-> IxStateT f s s a -> s -> f (a, s)
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view (Unwrapped (IxStateT f s s a)
 -> Const (s -> f (a, s)) (Unwrapped (IxStateT f s s a)))
-> IxStateT f s s a -> Const (s -> f (a, s)) (IxStateT f s s a)
Getting (s -> f (a, s)) (IxStateT f s s a) (s -> f (a, s))
forall s t. Rewrapping s t => Iso s t (Unwrapped s) (Unwrapped t)
Iso
  (IxStateT f s s a)
  (IxStateT f s s a)
  (Unwrapped (IxStateT f s s a))
  (Unwrapped (IxStateT f s s a))
_Wrapped (r -> IxStateT f s s a
g r
r) s
s))

instance MonadFix f => MonadFix (IxStateT f s s) where
  mfix :: forall a. (a -> IxStateT f s s a) -> IxStateT f s s a
mfix =
    (a -> IxStateT f s s a) -> IxStateT f s s a
forall a t s. (a -> IxStateT f t s a) -> IxStateT f t s a
forall (f :: * -> * -> * -> *) a t s.
IxMonadFix f =>
(a -> f t s a) -> f t s a
imfix

instance MonadFix f => IxMonadFix (IxStateT f) where
  imfix :: forall a t s. (a -> IxStateT f t s a) -> IxStateT f t s a
imfix a -> IxStateT f t s a
f =
    (s -> f (a, t)) -> IxStateT f t s a
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT (\s
s -> ((a, t) -> f (a, t)) -> f (a, t)
forall a. (a -> f a) -> f a
forall (m :: * -> *) a. MonadFix m => (a -> m a) -> m a
mfix (\ ~(a
a, t
_) -> Getting (s -> f (a, t)) (IxStateT f t s a) (s -> f (a, t))
-> IxStateT f t s a -> s -> f (a, t)
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view (Unwrapped (IxStateT f t s a)
 -> Const (s -> f (a, t)) (Unwrapped (IxStateT f t s a)))
-> IxStateT f t s a -> Const (s -> f (a, t)) (IxStateT f t s a)
Getting (s -> f (a, t)) (IxStateT f t s a) (s -> f (a, t))
forall s t. Rewrapping s t => Iso s t (Unwrapped s) (Unwrapped t)
Iso
  (IxStateT f t s a)
  (IxStateT f t s a)
  (Unwrapped (IxStateT f t s a))
  (Unwrapped (IxStateT f t s a))
_Wrapped (a -> IxStateT f t s a
f a
a) s
s))

instance MonadCont f => MonadCont (IxStateT f s s) where
  callCC :: forall a b.
((a -> IxStateT f s s b) -> IxStateT f s s a) -> IxStateT f s s a
callCC (a -> IxStateT f s s b) -> IxStateT f s s a
f =
    (s -> f (a, s)) -> IxStateT f s s a
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT (\s
s -> (((a, s) -> f (b, s)) -> f (a, s)) -> f (a, s)
forall a b. ((a -> f b) -> f a) -> f a
forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a
callCC (\(a, s) -> f (b, s)
k -> Getting (s -> f (a, s)) (IxStateT f s s a) (s -> f (a, s))
-> IxStateT f s s a -> s -> f (a, s)
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view (Unwrapped (IxStateT f s s a)
 -> Const (s -> f (a, s)) (Unwrapped (IxStateT f s s a)))
-> IxStateT f s s a -> Const (s -> f (a, s)) (IxStateT f s s a)
Getting (s -> f (a, s)) (IxStateT f s s a) (s -> f (a, s))
forall s t. Rewrapping s t => Iso s t (Unwrapped s) (Unwrapped t)
Iso
  (IxStateT f s s a)
  (IxStateT f s s a)
  (Unwrapped (IxStateT f s s a))
  (Unwrapped (IxStateT f s s a))
_Wrapped ((a -> IxStateT f s s b) -> IxStateT f s s a
f (\a
a -> (s -> f (b, s)) -> IxStateT f s s b
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT (\s
s' -> (a, s) -> f (b, s)
k (a
a, s
s')))) s
s))

instance MonadCont f => IxMonadCont (IxStateT f) where
  icallCC :: forall a t r b s.
((a -> IxStateT f t r b) -> IxStateT f r s a) -> IxStateT f r s a
icallCC (a -> IxStateT f t r b) -> IxStateT f r s a
f =
    (s -> f (a, r)) -> IxStateT f r s a
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT (\s
s -> (((a, r) -> f (b, t)) -> f (a, r)) -> f (a, r)
forall a b. ((a -> f b) -> f a) -> f a
forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a
callCC (\(a, r) -> f (b, t)
k -> Getting (s -> f (a, r)) (IxStateT f r s a) (s -> f (a, r))
-> IxStateT f r s a -> s -> f (a, r)
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view (Unwrapped (IxStateT f r s a)
 -> Const (s -> f (a, r)) (Unwrapped (IxStateT f r s a)))
-> IxStateT f r s a -> Const (s -> f (a, r)) (IxStateT f r s a)
Getting (s -> f (a, r)) (IxStateT f r s a) (s -> f (a, r))
forall s t. Rewrapping s t => Iso s t (Unwrapped s) (Unwrapped t)
Iso
  (IxStateT f r s a)
  (IxStateT f r s a)
  (Unwrapped (IxStateT f r s a))
  (Unwrapped (IxStateT f r s a))
_Wrapped ((a -> IxStateT f t r b) -> IxStateT f r s a
f (\a
a -> (r -> f (b, t)) -> IxStateT f t r b
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT (\r
s' -> (a, r) -> f (b, t)
k (a
a, r
s')))) s
s))

instance MonadIO f => MonadIO (IxStateT f s s) where
  liftIO :: forall a. IO a -> IxStateT f s s a
liftIO =
    f a -> IxStateT f s s a
forall (f :: * -> *) a s. Monad f => f a -> IxStateT f s s a
forall (g :: (* -> *) -> * -> * -> * -> *) (f :: * -> *) a s.
(IxMonadTrans g, Monad f) =>
f a -> g f s s a
ilift (f a -> IxStateT f s s a)
-> (IO a -> f a) -> IO a -> IxStateT f s s a
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. IO a -> f a
forall a. IO a -> f a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO

instance (Semigroup t, Bind f) => Semigroupoid (IxStateT f t) where
  IxStateT j -> f (k1, t)
f o :: forall j k1 i.
IxStateT f t j k1 -> IxStateT f t i j -> IxStateT f t i k1
`o` IxStateT i -> f (j, t)
g =
    (i -> f (k1, t)) -> IxStateT f t i k1
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT (i -> f (j, t)
g (i -> f (j, t)) -> ((j, t) -> f (k1, t)) -> i -> f (k1, t)
forall (m :: * -> *) a b c.
Bind m =>
(a -> m b) -> (b -> m c) -> a -> m c
->- (\ ~(j
a, t
t) -> ((k1, t) -> (k1, t)) -> f (k1, t) -> f (k1, t)
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (ASetter (k1, t) (k1, t) t t -> (t -> t) -> (k1, t) -> (k1, t)
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over ASetter (k1, t) (k1, t) t t
forall s t a b. Field2 s t a b => Lens s t a b
Lens (k1, t) (k1, t) t t
_2 (t
t t -> t -> t
forall a. Semigroup a => a -> a -> a
<>)) (j -> f (k1, t)
f j
a)))

instance (Monoid t, Monad f) => Category (IxStateT f t) where
  IxStateT b -> f (c, t)
f . :: forall b c a.
IxStateT f t b c -> IxStateT f t a b -> IxStateT f t a c
. IxStateT a -> f (b, t)
g =
    (a -> f (c, t)) -> IxStateT f t a c
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT (a -> f (b, t)
g (a -> f (b, t)) -> ((b, t) -> f (c, t)) -> a -> f (c, t)
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> (\ ~(b
a, t
t) -> ((c, t) -> (c, t)) -> f (c, t) -> f (c, t)
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (ASetter (c, t) (c, t) t t -> (t -> t) -> (c, t) -> (c, t)
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over ASetter (c, t) (c, t) t t
forall s t a b. Field2 s t a b => Lens s t a b
Lens (c, t) (c, t) t t
_2 (t
t t -> t -> t
forall a. Semigroup a => a -> a -> a
<>)) (b -> f (c, t)
f b
a)))
  id :: forall a. IxStateT f t a a
id =
    (a -> f (a, t)) -> IxStateT f t a a
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT (\a
s -> (a, t) -> f (a, t)
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a
s, t
forall a. Monoid a => a
mempty))

instance Functor f => Profunctor (IxStateT f t) where
  dimap :: forall a b c d.
(a -> b) -> (c -> d) -> IxStateT f t b c -> IxStateT f t a d
dimap a -> b
f c -> d
g (IxStateT b -> f (c, t)
k) =
    (a -> f (d, t)) -> IxStateT f t a d
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT (((c, t) -> (d, t)) -> f (c, t) -> f (d, t)
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (ASetter (c, t) (d, t) c d -> (c -> d) -> (c, t) -> (d, t)
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over ASetter (c, t) (d, t) c d
forall s t a b. Field1 s t a b => Lens s t a b
Lens (c, t) (d, t) c d
_1 c -> d
g) (f (c, t) -> f (d, t)) -> (a -> f (c, t)) -> a -> f (d, t)
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. b -> f (c, t)
k (b -> f (c, t)) -> (a -> b) -> a -> f (c, t)
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. a -> b
f)

instance (Monoid t, Applicative f) => Choice (IxStateT f t) where
  left' :: forall a b c.
IxStateT f t a b -> IxStateT f t (Either a c) (Either b c)
left' =
    ASetter
  (IxStateT f t a b)
  (IxStateT f t (Either a c) (Either b c))
  (a -> f (b, t))
  (Either a c -> f (Either b c, t))
-> ((a -> f (b, t)) -> Either a c -> f (Either b c, t))
-> IxStateT f t a b
-> IxStateT f t (Either a c) (Either b c)
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over (Unwrapped (IxStateT f t a b)
 -> Identity (Unwrapped (IxStateT f t (Either a c) (Either b c))))
-> IxStateT f t a b
-> Identity (IxStateT f t (Either a c) (Either b c))
ASetter
  (IxStateT f t a b)
  (IxStateT f t (Either a c) (Either b c))
  (a -> f (b, t))
  (Either a c -> f (Either b c, t))
forall s t. Rewrapping s t => Iso s t (Unwrapped s) (Unwrapped t)
Iso
  (IxStateT f t a b)
  (IxStateT f t (Either a c) (Either b c))
  (Unwrapped (IxStateT f t a b))
  (Unwrapped (IxStateT f t (Either a c) (Either b c)))
_Wrapped (\a -> f (b, t)
f -> (a -> f (Either b c, t))
-> (c -> f (Either b c, t)) -> Either a c -> f (Either b c, t)
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (((b, t) -> (Either b c, t)) -> f (b, t) -> f (Either b c, t)
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (ASetter (b, t) (Either b c, t) b (Either b c)
-> (b -> Either b c) -> (b, t) -> (Either b c, t)
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over ASetter (b, t) (Either b c, t) b (Either b c)
forall s t a b. Field1 s t a b => Lens s t a b
Lens (b, t) (Either b c, t) b (Either b c)
_1 b -> Either b c
forall a b. a -> Either a b
Left) (f (b, t) -> f (Either b c, t))
-> (a -> f (b, t)) -> a -> f (Either b c, t)
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. a -> f (b, t)
f) (\c
c -> (Either b c, t) -> f (Either b c, t)
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (c -> Either b c
forall a b. b -> Either a b
Right c
c, t
forall a. Monoid a => a
mempty)))
  right' :: forall a b c.
IxStateT f t a b -> IxStateT f t (Either c a) (Either c b)
right' =
    ASetter
  (IxStateT f t a b)
  (IxStateT f t (Either c a) (Either c b))
  (a -> f (b, t))
  (Either c a -> f (Either c b, t))
-> ((a -> f (b, t)) -> Either c a -> f (Either c b, t))
-> IxStateT f t a b
-> IxStateT f t (Either c a) (Either c b)
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over (Unwrapped (IxStateT f t a b)
 -> Identity (Unwrapped (IxStateT f t (Either c a) (Either c b))))
-> IxStateT f t a b
-> Identity (IxStateT f t (Either c a) (Either c b))
ASetter
  (IxStateT f t a b)
  (IxStateT f t (Either c a) (Either c b))
  (a -> f (b, t))
  (Either c a -> f (Either c b, t))
forall s t. Rewrapping s t => Iso s t (Unwrapped s) (Unwrapped t)
Iso
  (IxStateT f t a b)
  (IxStateT f t (Either c a) (Either c b))
  (Unwrapped (IxStateT f t a b))
  (Unwrapped (IxStateT f t (Either c a) (Either c b)))
_Wrapped (\a -> f (b, t)
f -> (c -> f (Either c b, t))
-> (a -> f (Either c b, t)) -> Either c a -> f (Either c b, t)
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (\c
c -> (Either c b, t) -> f (Either c b, t)
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (c -> Either c b
forall a b. a -> Either a b
Left c
c, t
forall a. Monoid a => a
mempty)) (((b, t) -> (Either c b, t)) -> f (b, t) -> f (Either c b, t)
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (ASetter (b, t) (Either c b, t) b (Either c b)
-> (b -> Either c b) -> (b, t) -> (Either c b, t)
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over ASetter (b, t) (Either c b, t) b (Either c b)
forall s t a b. Field1 s t a b => Lens s t a b
Lens (b, t) (Either c b, t) b (Either c b)
_1 b -> Either c b
forall a b. b -> Either a b
Right) (f (b, t) -> f (Either c b, t))
-> (a -> f (b, t)) -> a -> f (Either c b, t)
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. a -> f (b, t)
f))

instance Functor f => Strong (IxStateT f t) where
  first' :: forall a b c. IxStateT f t a b -> IxStateT f t (a, c) (b, c)
first' =
    ASetter
  (IxStateT f t a b)
  (IxStateT f t (a, c) (b, c))
  (a -> f (b, t))
  ((a, c) -> f ((b, c), t))
-> ((a -> f (b, t)) -> (a, c) -> f ((b, c), t))
-> IxStateT f t a b
-> IxStateT f t (a, c) (b, c)
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over (Unwrapped (IxStateT f t a b)
 -> Identity (Unwrapped (IxStateT f t (a, c) (b, c))))
-> IxStateT f t a b -> Identity (IxStateT f t (a, c) (b, c))
ASetter
  (IxStateT f t a b)
  (IxStateT f t (a, c) (b, c))
  (a -> f (b, t))
  ((a, c) -> f ((b, c), t))
forall s t. Rewrapping s t => Iso s t (Unwrapped s) (Unwrapped t)
Iso
  (IxStateT f t a b)
  (IxStateT f t (a, c) (b, c))
  (Unwrapped (IxStateT f t a b))
  (Unwrapped (IxStateT f t (a, c) (b, c)))
_Wrapped (\a -> f (b, t)
f (a
a, c
c) -> ((b, t) -> ((b, c), t)) -> f (b, t) -> f ((b, c), t)
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(b
b, t
t) -> ((b
b, c
c), t
t)) (a -> f (b, t)
f a
a))
  second' :: forall a b c. IxStateT f t a b -> IxStateT f t (c, a) (c, b)
second' =
    ASetter
  (IxStateT f t a b)
  (IxStateT f t (c, a) (c, b))
  (a -> f (b, t))
  ((c, a) -> f ((c, b), t))
-> ((a -> f (b, t)) -> (c, a) -> f ((c, b), t))
-> IxStateT f t a b
-> IxStateT f t (c, a) (c, b)
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over (Unwrapped (IxStateT f t a b)
 -> Identity (Unwrapped (IxStateT f t (c, a) (c, b))))
-> IxStateT f t a b -> Identity (IxStateT f t (c, a) (c, b))
ASetter
  (IxStateT f t a b)
  (IxStateT f t (c, a) (c, b))
  (a -> f (b, t))
  ((c, a) -> f ((c, b), t))
forall s t. Rewrapping s t => Iso s t (Unwrapped s) (Unwrapped t)
Iso
  (IxStateT f t a b)
  (IxStateT f t (c, a) (c, b))
  (Unwrapped (IxStateT f t a b))
  (Unwrapped (IxStateT f t (c, a) (c, b)))
_Wrapped (\a -> f (b, t)
f (c
c, a
a) -> ((b, t) -> ((c, b), t)) -> f (b, t) -> f ((c, b), t)
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(b
b, t
t) -> ((c
c, b
b), t
t)) (a -> f (b, t)
f a
a))

instance (Monad f, Monoid t) => Arrow (IxStateT f t) where
  arr :: forall b c. (b -> c) -> IxStateT f t b c
arr b -> c
f =
    (b -> f (c, t)) -> IxStateT f t b c
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT (\b
s -> (c, t) -> f (c, t)
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (b -> c
f b
s, t
forall a. Monoid a => a
mempty))
  first :: forall b c d. IxStateT f t b c -> IxStateT f t (b, d) (c, d)
first =
    ASetter
  (IxStateT f t b c)
  (IxStateT f t (b, d) (c, d))
  (b -> f (c, t))
  ((b, d) -> f ((c, d), t))
-> ((b -> f (c, t)) -> (b, d) -> f ((c, d), t))
-> IxStateT f t b c
-> IxStateT f t (b, d) (c, d)
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over (Unwrapped (IxStateT f t b c)
 -> Identity (Unwrapped (IxStateT f t (b, d) (c, d))))
-> IxStateT f t b c -> Identity (IxStateT f t (b, d) (c, d))
ASetter
  (IxStateT f t b c)
  (IxStateT f t (b, d) (c, d))
  (b -> f (c, t))
  ((b, d) -> f ((c, d), t))
forall s t. Rewrapping s t => Iso s t (Unwrapped s) (Unwrapped t)
Iso
  (IxStateT f t b c)
  (IxStateT f t (b, d) (c, d))
  (Unwrapped (IxStateT f t b c))
  (Unwrapped (IxStateT f t (b, d) (c, d)))
_Wrapped (\b -> f (c, t)
f (b
b, d
d) -> ((c, t) -> ((c, d), t)) -> f (c, t) -> f ((c, d), t)
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(c
c, t
t) -> ((c
c, d
d), t
t)) (b -> f (c, t)
f b
b))

instance (Monad f, Monoid t) => ArrowApply (IxStateT f t) where
  app :: forall b c. IxStateT f t (IxStateT f t b c, b) c
app =
    ((IxStateT f t b c, b) -> f (c, t))
-> IxStateT f t (IxStateT f t b c, b) c
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT (\(IxStateT b -> f (c, t)
k, b
b) -> b -> f (c, t)
k b
b)

instance (Monad f, Monoid t) => ArrowChoice (IxStateT f t) where
  left :: forall b c d.
IxStateT f t b c -> IxStateT f t (Either b d) (Either c d)
left =
    ASetter
  (IxStateT f t b c)
  (IxStateT f t (Either b d) (Either c d))
  (b -> f (c, t))
  (Either b d -> f (Either c d, t))
-> ((b -> f (c, t)) -> Either b d -> f (Either c d, t))
-> IxStateT f t b c
-> IxStateT f t (Either b d) (Either c d)
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over (Unwrapped (IxStateT f t b c)
 -> Identity (Unwrapped (IxStateT f t (Either b d) (Either c d))))
-> IxStateT f t b c
-> Identity (IxStateT f t (Either b d) (Either c d))
ASetter
  (IxStateT f t b c)
  (IxStateT f t (Either b d) (Either c d))
  (b -> f (c, t))
  (Either b d -> f (Either c d, t))
forall s t. Rewrapping s t => Iso s t (Unwrapped s) (Unwrapped t)
Iso
  (IxStateT f t b c)
  (IxStateT f t (Either b d) (Either c d))
  (Unwrapped (IxStateT f t b c))
  (Unwrapped (IxStateT f t (Either b d) (Either c d)))
_Wrapped (\b -> f (c, t)
k -> (b -> f (Either c d, t))
-> (d -> f (Either c d, t)) -> Either b d -> f (Either c d, t)
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (((c, t) -> (Either c d, t)) -> f (c, t) -> f (Either c d, t)
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (ASetter (c, t) (Either c d, t) c (Either c d)
-> (c -> Either c d) -> (c, t) -> (Either c d, t)
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over ASetter (c, t) (Either c d, t) c (Either c d)
forall s t a b. Field1 s t a b => Lens s t a b
Lens (c, t) (Either c d, t) c (Either c d)
_1 c -> Either c d
forall a b. a -> Either a b
Left) (f (c, t) -> f (Either c d, t))
-> (b -> f (c, t)) -> b -> f (Either c d, t)
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. b -> f (c, t)
k) (\d
d -> (Either c d, t) -> f (Either c d, t)
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (d -> Either c d
forall a b. b -> Either a b
Right d
d, t
forall a. Monoid a => a
mempty)))

instance IxBindTrans IxStateT where
  iliftB :: forall (f :: * -> *) a s. Bind f => f a -> IxStateT f s s a
iliftB f a
a =
    (s -> f (a, s)) -> IxStateT f s s a
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT (\s
s -> (a -> (a, s)) -> f a -> f (a, s)
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (, s
s) f a
a)

instance IxMonadTrans IxStateT where
  ilift :: forall (f :: * -> *) a s. Monad f => f a -> IxStateT f s s a
ilift f a
a =
    (s -> f (a, s)) -> IxStateT f s s a
forall (f :: * -> *) t s a. (s -> f (a, t)) -> IxStateT f t s a
IxStateT (\s
s -> (a -> (a, s)) -> f a -> f (a, s)
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (, s
s) f a
a)