{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE DeriveFunctor #-}

module FMonad.State.Day
  (StateT(..),
   flift,
   toOuter, fromOuter, toInner, fromInner,
   
   State, state, state_, get, put,
   runState
) where

import Control.Monad.Trans.Identity
import Data.Functor.Day ( Day(..), day )
import Data.Functor.Day.Curried ( Curried(Curried) )
import Data.Functor.Day.Comonoid

import FMonad
import FMonad.Adjoint
import FStrong

import qualified FMonad.State.Simple.Inner as Simple.Inner
import qualified FMonad.State.Simple.Outer as Simple.Outer

import Data.Functor.Day.Extra
import Data.Coerce (coerce)
import Data.Functor.Identity
import Data.Function ((&))

newtype StateT s mm x a = StateT { forall (s :: * -> *) (mm :: (* -> *) -> * -> *) (x :: * -> *) a.
StateT s mm x a -> forall r. s (a -> r) -> mm (Day s x) r
runStateT :: forall r. s (a -> r) -> mm (Day s x) r }
   deriving stock (forall a b. (a -> b) -> StateT s mm x a -> StateT s mm x b)
-> (forall a b. a -> StateT s mm x b -> StateT s mm x a)
-> Functor (StateT s mm x)
forall a b. a -> StateT s mm x b -> StateT s mm x a
forall a b. (a -> b) -> StateT s mm x a -> StateT s mm x b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
forall (s :: * -> *) (mm :: (* -> *) -> * -> *) (x :: * -> *) a b.
Functor s =>
a -> StateT s mm x b -> StateT s mm x a
forall (s :: * -> *) (mm :: (* -> *) -> * -> *) (x :: * -> *) a b.
Functor s =>
(a -> b) -> StateT s mm x a -> StateT s mm x b
$cfmap :: forall (s :: * -> *) (mm :: (* -> *) -> * -> *) (x :: * -> *) a b.
Functor s =>
(a -> b) -> StateT s mm x a -> StateT s mm x b
fmap :: forall a b. (a -> b) -> StateT s mm x a -> StateT s mm x b
$c<$ :: forall (s :: * -> *) (mm :: (* -> *) -> * -> *) (x :: * -> *) a b.
Functor s =>
a -> StateT s mm x b -> StateT s mm x a
<$ :: forall a b. a -> StateT s mm x b -> StateT s mm x a
Functor
   deriving ((forall (g :: * -> *). Functor g => Functor (StateT s mm g)) =>
(forall (g :: * -> *) (h :: * -> *) x.
 (Functor g, Functor h) =>
 (g ~> h) -> StateT s mm g x -> StateT s mm h x)
-> FFunctor (StateT s mm)
forall (g :: * -> *). Functor g => Functor (StateT s mm g)
forall (g :: * -> *) (h :: * -> *) x.
(Functor g, Functor h) =>
(g ~> h) -> StateT s mm g x -> StateT s mm h x
forall (s :: * -> *) (mm :: (* -> *) -> * -> *) (g :: * -> *).
(FFunctor mm, Functor s, Functor g) =>
Functor (StateT s mm g)
forall (s :: * -> *) (mm :: (* -> *) -> * -> *) (g :: * -> *)
       (h :: * -> *) x.
(FFunctor mm, Functor s, Functor g, Functor h) =>
(g ~> h) -> StateT s mm g x -> StateT s mm h x
forall (ff :: (* -> *) -> * -> *).
(forall (g :: * -> *). Functor g => Functor (ff g)) =>
(forall (g :: * -> *) (h :: * -> *) x.
 (Functor g, Functor h) =>
 (g ~> h) -> ff g x -> ff h x)
-> FFunctor ff
$cffmap :: forall (s :: * -> *) (mm :: (* -> *) -> * -> *) (g :: * -> *)
       (h :: * -> *) x.
(FFunctor mm, Functor s, Functor g, Functor h) =>
(g ~> h) -> StateT s mm g x -> StateT s mm h x
ffmap :: forall (g :: * -> *) (h :: * -> *) x.
(Functor g, Functor h) =>
(g ~> h) -> StateT s mm g x -> StateT s mm h x
FFunctor, FFunctor (StateT s mm)
FFunctor (StateT s mm) =>
(forall (g :: * -> *). Functor g => g ~> StateT s mm g)
-> (forall (g :: * -> *) (h :: * -> *) a.
    (Functor g, Functor h) =>
    (g ~> StateT s mm h) -> StateT s mm g a -> StateT s mm h a)
-> FMonad (StateT s mm)
forall (g :: * -> *). Functor g => g ~> StateT s mm g
forall (g :: * -> *) (h :: * -> *) a.
(Functor g, Functor h) =>
(g ~> StateT s mm h) -> StateT s mm g a -> StateT s mm h a
forall (s :: * -> *) (mm :: (* -> *) -> * -> *).
(Functor s, FMonad mm) =>
FFunctor (StateT s mm)
forall (s :: * -> *) (mm :: (* -> *) -> * -> *) (g :: * -> *).
(Functor s, FMonad mm, Functor g) =>
g ~> StateT s mm g
forall (s :: * -> *) (mm :: (* -> *) -> * -> *) (g :: * -> *)
       (h :: * -> *) a.
(Functor s, FMonad mm, Functor g, Functor h) =>
(g ~> StateT s mm h) -> StateT s mm g a -> StateT s mm h a
forall (ff :: (* -> *) -> * -> *).
FFunctor ff =>
(forall (g :: * -> *). Functor g => g ~> ff g)
-> (forall (g :: * -> *) (h :: * -> *) a.
    (Functor g, Functor h) =>
    (g ~> ff h) -> ff g a -> ff h a)
-> FMonad ff
$cfpure :: forall (s :: * -> *) (mm :: (* -> *) -> * -> *) (g :: * -> *).
(Functor s, FMonad mm, Functor g) =>
g ~> StateT s mm g
fpure :: forall (g :: * -> *). Functor g => g ~> StateT s mm g
$cfbind :: forall (s :: * -> *) (mm :: (* -> *) -> * -> *) (g :: * -> *)
       (h :: * -> *) a.
(Functor s, FMonad mm, Functor g, Functor h) =>
(g ~> StateT s mm h) -> StateT s mm g a -> StateT s mm h a
fbind :: forall (g :: * -> *) (h :: * -> *) a.
(Functor g, Functor h) =>
(g ~> StateT s mm h) -> StateT s mm g a -> StateT s mm h a
FMonad) via (AdjointT (Day s) (Curried s) mm)

toAdjointT :: StateT s mm x ~> AdjointT (Day s) (Curried s) mm x
toAdjointT :: forall (s :: * -> *) (mm :: (* -> *) -> * -> *) (x :: * -> *) x.
StateT s mm x x -> AdjointT (Day s) (Curried s) mm x x
toAdjointT = StateT s mm x x -> AdjointT (Day s) (Curried s) mm x x
forall a b. Coercible a b => a -> b
coerce

fromAdjointT :: AdjointT (Day s) (Curried s) mm x ~> StateT s mm x
fromAdjointT :: forall (s :: * -> *) (mm :: (* -> *) -> * -> *) (x :: * -> *) x.
AdjointT (Day s) (Curried s) mm x x -> StateT s mm x x
fromAdjointT = AdjointT (Day s) (Curried s) mm x x -> StateT s mm x x
forall a b. Coercible a b => a -> b
coerce

flift :: (Functor s, FStrong mm, Functor x)
  => mm x ~> StateT s mm x
flift :: forall (s :: * -> *) (mm :: (* -> *) -> * -> *) (x :: * -> *).
(Functor s, FStrong mm, Functor x) =>
mm x ~> StateT s mm x
flift mm x x
mm = (forall r. s (x -> r) -> mm (Day s x) r) -> StateT s mm x x
forall (s :: * -> *) (mm :: (* -> *) -> * -> *) (x :: * -> *) a.
(forall r. s (a -> r) -> mm (Day s x) r) -> StateT s mm x a
StateT ((forall r. s (x -> r) -> mm (Day s x) r) -> StateT s mm x x)
-> (forall r. s (x -> r) -> mm (Day s x) r) -> StateT s mm x x
forall a b. (a -> b) -> a -> b
$ \s (x -> r)
sf -> Day s (mm x) r -> mm (Day s x) r
Day s (mm x) ~> mm (Day s x)
forall (ff :: (* -> *) -> * -> *) (h :: * -> *) (g :: * -> *).
(FStrong ff, Functor h) =>
Day g (ff h) ~> ff (Day g h)
fstrength' (s (x -> r) -> mm x x -> Day s (mm x) r
forall (f :: * -> *) a b (g :: * -> *).
f (a -> b) -> g a -> Day f g b
day s (x -> r)
sf mm x x
mm)

toOuter :: (Functor x, FFunctor mm) => StateT ((,) s0) mm x ~> Simple.Outer.StateT s0 mm x
toOuter :: forall (x :: * -> *) (mm :: (* -> *) -> * -> *) s0.
(Functor x, FFunctor mm) =>
StateT ((,) s0) mm x ~> StateT s0 mm x
toOuter = AdjointT (EnvT s0) (ReaderT s0) mm x x -> StateT s0 mm x x
forall s0 (mm :: (* -> *) -> * -> *) (x1 :: * -> *) x2.
AdjointT (EnvT s0) (ReaderT s0) mm x1 x2 -> StateT s0 mm x1 x2
Simple.Outer.fromAdjointT (AdjointT (EnvT s0) (ReaderT s0) mm x x -> StateT s0 mm x x)
-> (StateT ((,) s0) mm x x
    -> AdjointT (EnvT s0) (ReaderT s0) mm x x)
-> StateT ((,) s0) mm x x
-> StateT s0 mm x x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ReaderT s0 (mm (EnvT s0 x)) x
-> AdjointT (EnvT s0) (ReaderT s0) mm x x
forall {k} {k1} {k2} {k3} (ff :: k -> k1) (uu :: k2 -> k3 -> *)
       (mm :: k1 -> k2) (g :: k) (x :: k3).
uu (mm (ff g)) x -> AdjointT ff uu mm g x
AdjointT (ReaderT s0 (mm (EnvT s0 x)) x
 -> AdjointT (EnvT s0) (ReaderT s0) mm x x)
-> (StateT ((,) s0) mm x x -> ReaderT s0 (mm (EnvT s0 x)) x)
-> StateT ((,) s0) mm x x
-> AdjointT (EnvT s0) (ReaderT s0) mm x x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (mm (Day ((,) s0) x) ~> mm (EnvT s0 x))
-> ReaderT s0 (mm (Day ((,) s0) x)) x
-> ReaderT s0 (mm (EnvT s0 x)) x
forall (g :: * -> *) (h :: * -> *) x.
(Functor g, Functor h) =>
(g ~> h) -> ReaderT s0 g x -> ReaderT s0 h x
forall (ff :: (* -> *) -> * -> *) (g :: * -> *) (h :: * -> *) x.
(FFunctor ff, Functor g, Functor h) =>
(g ~> h) -> ff g x -> ff h x
ffmap ((Day ((,) s0) x ~> EnvT s0 x)
-> mm (Day ((,) s0) x) x -> mm (EnvT s0 x) x
forall (g :: * -> *) (h :: * -> *) x.
(Functor g, Functor h) =>
(g ~> h) -> mm g x -> mm h x
forall (ff :: (* -> *) -> * -> *) (g :: * -> *) (h :: * -> *) x.
(FFunctor ff, Functor g, Functor h) =>
(g ~> h) -> ff g x -> ff h x
ffmap Day ((,) s0) x x -> EnvT s0 x x
Day ((,) s0) x ~> EnvT s0 x
forall (f :: * -> *) s0. Functor f => Day ((,) s0) f ~> EnvT s0 f
dayToEnv) (ReaderT s0 (mm (Day ((,) s0) x)) x
 -> ReaderT s0 (mm (EnvT s0 x)) x)
-> (StateT ((,) s0) mm x x -> ReaderT s0 (mm (Day ((,) s0) x)) x)
-> StateT ((,) s0) mm x x
-> ReaderT s0 (mm (EnvT s0 x)) x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Curried ((,) s0) (mm (Day ((,) s0) x)) x
-> ReaderT s0 (mm (Day ((,) s0) x)) x
forall s0 (f :: * -> *) x. Curried ((,) s0) f x -> ReaderT s0 f x
curriedToReader (Curried ((,) s0) (mm (Day ((,) s0) x)) x
 -> ReaderT s0 (mm (Day ((,) s0) x)) x)
-> (StateT ((,) s0) mm x x
    -> Curried ((,) s0) (mm (Day ((,) s0) x)) x)
-> StateT ((,) s0) mm x x
-> ReaderT s0 (mm (Day ((,) s0) x)) x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AdjointT (Day ((,) s0)) (Curried ((,) s0)) mm x x
-> Curried ((,) s0) (mm (Day ((,) s0) x)) x
forall {k1} {k2} {k3} {k4} (ff :: k1 -> k2) (uu :: k3 -> k4 -> *)
       (mm :: k2 -> k3) (g :: k1) (x :: k4).
AdjointT ff uu mm g x -> uu (mm (ff g)) x
runAdjointT (AdjointT (Day ((,) s0)) (Curried ((,) s0)) mm x x
 -> Curried ((,) s0) (mm (Day ((,) s0) x)) x)
-> (StateT ((,) s0) mm x x
    -> AdjointT (Day ((,) s0)) (Curried ((,) s0)) mm x x)
-> StateT ((,) s0) mm x x
-> Curried ((,) s0) (mm (Day ((,) s0) x)) x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. StateT ((,) s0) mm x x
-> AdjointT (Day ((,) s0)) (Curried ((,) s0)) mm x x
forall (s :: * -> *) (mm :: (* -> *) -> * -> *) (x :: * -> *) x.
StateT s mm x x -> AdjointT (Day s) (Curried s) mm x x
toAdjointT

fromOuter :: (Functor x, FFunctor mm) => Simple.Outer.StateT s0 mm x ~> StateT ((,) s0) mm x
fromOuter :: forall (x :: * -> *) (mm :: (* -> *) -> * -> *) s0.
(Functor x, FFunctor mm) =>
StateT s0 mm x ~> StateT ((,) s0) mm x
fromOuter = AdjointT (Day ((,) s0)) (Curried ((,) s0)) mm x x
-> StateT ((,) s0) mm x x
forall (s :: * -> *) (mm :: (* -> *) -> * -> *) (x :: * -> *) x.
AdjointT (Day s) (Curried s) mm x x -> StateT s mm x x
fromAdjointT (AdjointT (Day ((,) s0)) (Curried ((,) s0)) mm x x
 -> StateT ((,) s0) mm x x)
-> (StateT s0 mm x x
    -> AdjointT (Day ((,) s0)) (Curried ((,) s0)) mm x x)
-> StateT s0 mm x x
-> StateT ((,) s0) mm x x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Curried ((,) s0) (mm (Day ((,) s0) x)) x
-> AdjointT (Day ((,) s0)) (Curried ((,) s0)) mm x x
forall {k} {k1} {k2} {k3} (ff :: k -> k1) (uu :: k2 -> k3 -> *)
       (mm :: k1 -> k2) (g :: k) (x :: k3).
uu (mm (ff g)) x -> AdjointT ff uu mm g x
AdjointT (Curried ((,) s0) (mm (Day ((,) s0) x)) x
 -> AdjointT (Day ((,) s0)) (Curried ((,) s0)) mm x x)
-> (StateT s0 mm x x -> Curried ((,) s0) (mm (Day ((,) s0) x)) x)
-> StateT s0 mm x x
-> AdjointT (Day ((,) s0)) (Curried ((,) s0)) mm x x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (mm (EnvT s0 x) ~> mm (Day ((,) s0) x))
-> Curried ((,) s0) (mm (EnvT s0 x)) x
-> Curried ((,) s0) (mm (Day ((,) s0) x)) x
forall (g :: * -> *) (h :: * -> *) x.
(Functor g, Functor h) =>
(g ~> h) -> Curried ((,) s0) g x -> Curried ((,) s0) h x
forall (ff :: (* -> *) -> * -> *) (g :: * -> *) (h :: * -> *) x.
(FFunctor ff, Functor g, Functor h) =>
(g ~> h) -> ff g x -> ff h x
ffmap ((EnvT s0 x ~> Day ((,) s0) x)
-> mm (EnvT s0 x) x -> mm (Day ((,) s0) x) x
forall (g :: * -> *) (h :: * -> *) x.
(Functor g, Functor h) =>
(g ~> h) -> mm g x -> mm h x
forall (ff :: (* -> *) -> * -> *) (g :: * -> *) (h :: * -> *) x.
(FFunctor ff, Functor g, Functor h) =>
(g ~> h) -> ff g x -> ff h x
ffmap EnvT s0 x x -> Day ((,) s0) x x
EnvT s0 x ~> Day ((,) s0) x
forall s0 (f :: * -> *) x. EnvT s0 f x -> Day ((,) s0) f x
envToDay) (Curried ((,) s0) (mm (EnvT s0 x)) x
 -> Curried ((,) s0) (mm (Day ((,) s0) x)) x)
-> (StateT s0 mm x x -> Curried ((,) s0) (mm (EnvT s0 x)) x)
-> StateT s0 mm x x
-> Curried ((,) s0) (mm (Day ((,) s0) x)) x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ReaderT s0 (mm (EnvT s0 x)) x
-> Curried ((,) s0) (mm (EnvT s0 x)) x
ReaderT s0 (mm (EnvT s0 x)) ~> Curried ((,) s0) (mm (EnvT s0 x))
forall (f :: * -> *) s0.
Functor f =>
ReaderT s0 f ~> Curried ((,) s0) f
readerToCurried (ReaderT s0 (mm (EnvT s0 x)) x
 -> Curried ((,) s0) (mm (EnvT s0 x)) x)
-> (StateT s0 mm x x -> ReaderT s0 (mm (EnvT s0 x)) x)
-> StateT s0 mm x x
-> Curried ((,) s0) (mm (EnvT s0 x)) x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AdjointT (EnvT s0) (ReaderT s0) mm x x
-> ReaderT s0 (mm (EnvT s0 x)) x
forall {k1} {k2} {k3} {k4} (ff :: k1 -> k2) (uu :: k3 -> k4 -> *)
       (mm :: k2 -> k3) (g :: k1) (x :: k4).
AdjointT ff uu mm g x -> uu (mm (ff g)) x
runAdjointT (AdjointT (EnvT s0) (ReaderT s0) mm x x
 -> ReaderT s0 (mm (EnvT s0 x)) x)
-> (StateT s0 mm x x -> AdjointT (EnvT s0) (ReaderT s0) mm x x)
-> StateT s0 mm x x
-> ReaderT s0 (mm (EnvT s0 x)) x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. StateT s0 mm x x -> AdjointT (EnvT s0) (ReaderT s0) mm x x
forall s0 (mm :: (* -> *) -> * -> *) (x1 :: * -> *) x2.
StateT s0 mm x1 x2 -> AdjointT (EnvT s0) (ReaderT s0) mm x1 x2
Simple.Outer.toAdjointT

toInner :: (Functor x, FFunctor mm) => StateT ((->) s1) mm x ~> Simple.Inner.StateT s1 mm x
toInner :: forall (x :: * -> *) (mm :: (* -> *) -> * -> *) s1.
(Functor x, FFunctor mm) =>
StateT ((->) s1) mm x ~> StateT s1 mm x
toInner = AdjointT (TracedT s1) (WriterT s1) mm x x -> StateT s1 mm x x
forall s1 (mm :: (* -> *) -> * -> *) (x1 :: * -> *) x2.
AdjointT (TracedT s1) (WriterT s1) mm x1 x2 -> StateT s1 mm x1 x2
Simple.Inner.fromAdjointT (AdjointT (TracedT s1) (WriterT s1) mm x x -> StateT s1 mm x x)
-> (StateT ((->) s1) mm x x
    -> AdjointT (TracedT s1) (WriterT s1) mm x x)
-> StateT ((->) s1) mm x x
-> StateT s1 mm x x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. WriterT s1 (mm (TracedT s1 x)) x
-> AdjointT (TracedT s1) (WriterT s1) mm x x
forall {k} {k1} {k2} {k3} (ff :: k -> k1) (uu :: k2 -> k3 -> *)
       (mm :: k1 -> k2) (g :: k) (x :: k3).
uu (mm (ff g)) x -> AdjointT ff uu mm g x
AdjointT (WriterT s1 (mm (TracedT s1 x)) x
 -> AdjointT (TracedT s1) (WriterT s1) mm x x)
-> (StateT ((->) s1) mm x x -> WriterT s1 (mm (TracedT s1 x)) x)
-> StateT ((->) s1) mm x x
-> AdjointT (TracedT s1) (WriterT s1) mm x x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (mm (Day ((->) s1) x) ~> mm (TracedT s1 x))
-> WriterT s1 (mm (Day ((->) s1) x)) x
-> WriterT s1 (mm (TracedT s1 x)) x
forall (g :: * -> *) (h :: * -> *) x.
(Functor g, Functor h) =>
(g ~> h) -> WriterT s1 g x -> WriterT s1 h x
forall (ff :: (* -> *) -> * -> *) (g :: * -> *) (h :: * -> *) x.
(FFunctor ff, Functor g, Functor h) =>
(g ~> h) -> ff g x -> ff h x
ffmap ((Day ((->) s1) x ~> TracedT s1 x)
-> mm (Day ((->) s1) x) x -> mm (TracedT s1 x) x
forall (g :: * -> *) (h :: * -> *) x.
(Functor g, Functor h) =>
(g ~> h) -> mm g x -> mm h x
forall (ff :: (* -> *) -> * -> *) (g :: * -> *) (h :: * -> *) x.
(FFunctor ff, Functor g, Functor h) =>
(g ~> h) -> ff g x -> ff h x
ffmap Day ((->) s1) x x -> TracedT s1 x x
Day ((->) s1) x ~> TracedT s1 x
forall (f :: * -> *) s1.
Functor f =>
Day ((->) s1) f ~> TracedT s1 f
dayToTraced) (WriterT s1 (mm (Day ((->) s1) x)) x
 -> WriterT s1 (mm (TracedT s1 x)) x)
-> (StateT ((->) s1) mm x x -> WriterT s1 (mm (Day ((->) s1) x)) x)
-> StateT ((->) s1) mm x x
-> WriterT s1 (mm (TracedT s1 x)) x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Curried ((->) s1) (mm (Day ((->) s1) x)) x
-> WriterT s1 (mm (Day ((->) s1) x)) x
forall s1 (f :: * -> *) x. Curried ((->) s1) f x -> WriterT s1 f x
curriedToWriter (Curried ((->) s1) (mm (Day ((->) s1) x)) x
 -> WriterT s1 (mm (Day ((->) s1) x)) x)
-> (StateT ((->) s1) mm x x
    -> Curried ((->) s1) (mm (Day ((->) s1) x)) x)
-> StateT ((->) s1) mm x x
-> WriterT s1 (mm (Day ((->) s1) x)) x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AdjointT (Day ((->) s1)) (Curried ((->) s1)) mm x x
-> Curried ((->) s1) (mm (Day ((->) s1) x)) x
forall {k1} {k2} {k3} {k4} (ff :: k1 -> k2) (uu :: k3 -> k4 -> *)
       (mm :: k2 -> k3) (g :: k1) (x :: k4).
AdjointT ff uu mm g x -> uu (mm (ff g)) x
runAdjointT (AdjointT (Day ((->) s1)) (Curried ((->) s1)) mm x x
 -> Curried ((->) s1) (mm (Day ((->) s1) x)) x)
-> (StateT ((->) s1) mm x x
    -> AdjointT (Day ((->) s1)) (Curried ((->) s1)) mm x x)
-> StateT ((->) s1) mm x x
-> Curried ((->) s1) (mm (Day ((->) s1) x)) x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. StateT ((->) s1) mm x x
-> AdjointT (Day ((->) s1)) (Curried ((->) s1)) mm x x
forall (s :: * -> *) (mm :: (* -> *) -> * -> *) (x :: * -> *) x.
StateT s mm x x -> AdjointT (Day s) (Curried s) mm x x
toAdjointT

fromInner :: (Functor x, FFunctor mm) => Simple.Inner.StateT s1 mm x ~> StateT ((->) s1) mm x
fromInner :: forall (x :: * -> *) (mm :: (* -> *) -> * -> *) s1.
(Functor x, FFunctor mm) =>
StateT s1 mm x ~> StateT ((->) s1) mm x
fromInner = AdjointT (Day ((->) s1)) (Curried ((->) s1)) mm x x
-> StateT ((->) s1) mm x x
forall (s :: * -> *) (mm :: (* -> *) -> * -> *) (x :: * -> *) x.
AdjointT (Day s) (Curried s) mm x x -> StateT s mm x x
fromAdjointT (AdjointT (Day ((->) s1)) (Curried ((->) s1)) mm x x
 -> StateT ((->) s1) mm x x)
-> (StateT s1 mm x x
    -> AdjointT (Day ((->) s1)) (Curried ((->) s1)) mm x x)
-> StateT s1 mm x x
-> StateT ((->) s1) mm x x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Curried ((->) s1) (mm (Day ((->) s1) x)) x
-> AdjointT (Day ((->) s1)) (Curried ((->) s1)) mm x x
forall {k} {k1} {k2} {k3} (ff :: k -> k1) (uu :: k2 -> k3 -> *)
       (mm :: k1 -> k2) (g :: k) (x :: k3).
uu (mm (ff g)) x -> AdjointT ff uu mm g x
AdjointT (Curried ((->) s1) (mm (Day ((->) s1) x)) x
 -> AdjointT (Day ((->) s1)) (Curried ((->) s1)) mm x x)
-> (StateT s1 mm x x -> Curried ((->) s1) (mm (Day ((->) s1) x)) x)
-> StateT s1 mm x x
-> AdjointT (Day ((->) s1)) (Curried ((->) s1)) mm x x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (mm (TracedT s1 x) ~> mm (Day ((->) s1) x))
-> Curried ((->) s1) (mm (TracedT s1 x)) x
-> Curried ((->) s1) (mm (Day ((->) s1) x)) x
forall (g :: * -> *) (h :: * -> *) x.
(Functor g, Functor h) =>
(g ~> h) -> Curried ((->) s1) g x -> Curried ((->) s1) h x
forall (ff :: (* -> *) -> * -> *) (g :: * -> *) (h :: * -> *) x.
(FFunctor ff, Functor g, Functor h) =>
(g ~> h) -> ff g x -> ff h x
ffmap ((TracedT s1 x ~> Day ((->) s1) x)
-> mm (TracedT s1 x) x -> mm (Day ((->) s1) x) x
forall (g :: * -> *) (h :: * -> *) x.
(Functor g, Functor h) =>
(g ~> h) -> mm g x -> mm h x
forall (ff :: (* -> *) -> * -> *) (g :: * -> *) (h :: * -> *) x.
(FFunctor ff, Functor g, Functor h) =>
(g ~> h) -> ff g x -> ff h x
ffmap TracedT s1 x x -> Day ((->) s1) x x
TracedT s1 x ~> Day ((->) s1) x
forall s1 (f :: * -> *) x. TracedT s1 f x -> Day ((->) s1) f x
tracedToDay) (Curried ((->) s1) (mm (TracedT s1 x)) x
 -> Curried ((->) s1) (mm (Day ((->) s1) x)) x)
-> (StateT s1 mm x x -> Curried ((->) s1) (mm (TracedT s1 x)) x)
-> StateT s1 mm x x
-> Curried ((->) s1) (mm (Day ((->) s1) x)) x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. WriterT s1 (mm (TracedT s1 x)) x
-> Curried ((->) s1) (mm (TracedT s1 x)) x
WriterT s1 (mm (TracedT s1 x))
~> Curried ((->) s1) (mm (TracedT s1 x))
forall (f :: * -> *) s1.
Functor f =>
WriterT s1 f ~> Curried ((->) s1) f
writerToCurried (WriterT s1 (mm (TracedT s1 x)) x
 -> Curried ((->) s1) (mm (TracedT s1 x)) x)
-> (StateT s1 mm x x -> WriterT s1 (mm (TracedT s1 x)) x)
-> StateT s1 mm x x
-> Curried ((->) s1) (mm (TracedT s1 x)) x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AdjointT (TracedT s1) (WriterT s1) mm x x
-> WriterT s1 (mm (TracedT s1 x)) x
forall {k1} {k2} {k3} {k4} (ff :: k1 -> k2) (uu :: k3 -> k4 -> *)
       (mm :: k2 -> k3) (g :: k1) (x :: k4).
AdjointT ff uu mm g x -> uu (mm (ff g)) x
runAdjointT (AdjointT (TracedT s1) (WriterT s1) mm x x
 -> WriterT s1 (mm (TracedT s1 x)) x)
-> (StateT s1 mm x x -> AdjointT (TracedT s1) (WriterT s1) mm x x)
-> StateT s1 mm x x
-> WriterT s1 (mm (TracedT s1 x)) x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. StateT s1 mm x x -> AdjointT (TracedT s1) (WriterT s1) mm x x
forall s1 (mm :: (* -> *) -> * -> *) (x1 :: * -> *) x2.
StateT s1 mm x1 x2 -> AdjointT (TracedT s1) (WriterT s1) mm x1 x2
Simple.Inner.toAdjointT

type State s = StateT s IdentityT

state :: (FMonad mm)
  => (forall r. s (a -> r) -> Day s x r)
  -> StateT s mm x a
state :: forall (mm :: (* -> *) -> * -> *) (s :: * -> *) a (x :: * -> *).
FMonad mm =>
(forall r. s (a -> r) -> Day s x r) -> StateT s mm x a
state forall r. s (a -> r) -> Day s x r
f = (forall r. s (a -> r) -> mm (Day s x) r) -> StateT s mm x a
forall (s :: * -> *) (mm :: (* -> *) -> * -> *) (x :: * -> *) a.
(forall r. s (a -> r) -> mm (Day s x) r) -> StateT s mm x a
StateT ((forall r. s (a -> r) -> mm (Day s x) r) -> StateT s mm x a)
-> (forall r. s (a -> r) -> mm (Day s x) r) -> StateT s mm x a
forall a b. (a -> b) -> a -> b
$ \s (a -> r)
sar -> Day s x r -> mm (Day s x) r
Day s x ~> mm (Day s x)
forall (g :: * -> *). Functor g => g ~> mm g
forall (ff :: (* -> *) -> * -> *) (g :: * -> *).
(FMonad ff, Functor g) =>
g ~> ff g
fpure (s (a -> r) -> Day s x r
forall r. s (a -> r) -> Day s x r
f s (a -> r)
sar)

state_ :: (Functor s, FMonad mm)
  => (forall b. s b -> (s b, x a))
  -> StateT s mm x a
state_ :: forall (s :: * -> *) (mm :: (* -> *) -> * -> *) (x :: * -> *) a.
(Functor s, FMonad mm) =>
(forall b. s b -> (s b, x a)) -> StateT s mm x a
state_ forall b. s b -> (s b, x a)
f = (forall r. s (a -> r) -> Day s x r) -> StateT s mm x a
forall (mm :: (* -> *) -> * -> *) (s :: * -> *) a (x :: * -> *).
FMonad mm =>
(forall r. s (a -> r) -> Day s x r) -> StateT s mm x a
state ((s (a -> r) -> x a -> Day s x r) -> (s (a -> r), x a) -> Day s x r
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry s (a -> r) -> x a -> Day s x r
forall (f :: * -> *) a b (g :: * -> *).
f (a -> b) -> g a -> Day f g b
day ((s (a -> r), x a) -> Day s x r)
-> (s (a -> r) -> (s (a -> r), x a)) -> s (a -> r) -> Day s x r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. s (a -> r) -> (s (a -> r), x a)
forall b. s b -> (s b, x a)
f)

get :: (Comonoid s, FMonad mm) => StateT s mm s ()
get :: forall (s :: * -> *) (mm :: (* -> *) -> * -> *).
(Comonoid s, FMonad mm) =>
StateT s mm s ()
get = (forall r. s (() -> r) -> Day s s r) -> StateT s mm s ()
forall (mm :: (* -> *) -> * -> *) (s :: * -> *) a (x :: * -> *).
FMonad mm =>
(forall r. s (a -> r) -> Day s x r) -> StateT s mm x a
state (((() -> r) -> r) -> Day s s (() -> r) -> Day s s r
forall a b. (a -> b) -> Day s s a -> Day s s b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((() -> r) -> () -> r
forall a b. (a -> b) -> a -> b
$ ()) (Day s s (() -> r) -> Day s s r)
-> (s (() -> r) -> Day s s (() -> r)) -> s (() -> r) -> Day s s r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. s (() -> r) -> Day s s (() -> r)
forall a. s a -> Day s s a
forall (f :: * -> *) a. Comonoid f => f a -> Day f f a
coapply)

put :: (Comonad s, FMonad mm) => s a -> StateT s mm Identity a
put :: forall (s :: * -> *) (mm :: (* -> *) -> * -> *) a.
(Comonad s, FMonad mm) =>
s a -> StateT s mm Identity a
put s a
sa = (forall r. s (a -> r) -> Day s Identity r)
-> StateT s mm Identity a
forall (mm :: (* -> *) -> * -> *) (s :: * -> *) a (x :: * -> *).
FMonad mm =>
(forall r. s (a -> r) -> Day s x r) -> StateT s mm x a
state (\s (a -> r)
sar -> s a
-> Identity (a -> r) -> (a -> (a -> r) -> r) -> Day s Identity r
forall (f :: * -> *) (g :: * -> *) a b c.
f b -> g c -> (b -> c -> a) -> Day f g a
Day s a
sa ((a -> r) -> Identity (a -> r)
forall a. a -> Identity a
Identity (s (a -> r) -> a -> r
forall a. s a -> a
forall (w :: * -> *) a. Comonad w => w a -> a
extract s (a -> r)
sar)) a -> (a -> r) -> r
forall a b. a -> (a -> b) -> b
(&))

runState :: State s x a -> s (a -> r) -> Day s x r
runState :: forall (s :: * -> *) (x :: * -> *) a r.
State s x a -> s (a -> r) -> Day s x r
runState State s x a
sx = IdentityT (Day s x) r -> Day s x r
forall {k} (f :: k -> *) (a :: k). IdentityT f a -> f a
runIdentityT (IdentityT (Day s x) r -> Day s x r)
-> (s (a -> r) -> IdentityT (Day s x) r) -> s (a -> r) -> Day s x r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. State s x a -> forall r. s (a -> r) -> IdentityT (Day s x) r
forall (s :: * -> *) (mm :: (* -> *) -> * -> *) (x :: * -> *) a.
StateT s mm x a -> forall r. s (a -> r) -> mm (Day s x) r
runStateT State s x a
sx