{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
module Aztecs.ECS.Schedule
(
Schedule,
ScheduleT (..),
ArrowReaderSchedule (..),
ArrowSchedule (..),
ArrowAccessSchedule (..),
fromReaderSchedule,
delay,
forever,
forever_,
runSchedule,
runSchedule_,
)
where
import Aztecs.ECS.Access (AccessT (..), runAccessT)
import Aztecs.ECS.Schedule.Access.Class
import Aztecs.ECS.Schedule.Class
import Aztecs.ECS.Schedule.Dynamic
import Aztecs.ECS.Schedule.Reader (ReaderScheduleT (..))
import Aztecs.ECS.Schedule.Reader.Class
import Aztecs.ECS.System
import Aztecs.ECS.System.Dynamic
import Aztecs.ECS.System.Reader (ReaderSystemT (..))
import qualified Aztecs.ECS.View as V
import Aztecs.ECS.World (World (..))
import qualified Aztecs.ECS.World as W
import Aztecs.ECS.World.Bundle (Bundle)
import Aztecs.ECS.World.Components (Components)
import Aztecs.ECS.World.Entities (Entities (..))
import Control.Arrow
import Control.Category
import Control.DeepSeq
import Control.Exception
import Control.Monad.Fix
import Control.Monad.State (MonadState (..))
import Control.Monad.Trans (MonadTrans (..))
import Data.Functor
import Prelude hiding (id, (.))
type Schedule m = ScheduleT (AccessT m)
accessDyn :: (Monad m) => (i -> m o) -> DynamicScheduleT m i o
accessDyn :: forall (m :: * -> *) i o.
Monad m =>
(i -> m o) -> DynamicScheduleT m i o
accessDyn i -> m o
f = (i -> m (o, DynamicScheduleT m i o)) -> DynamicScheduleT m i o
forall (m :: * -> *) i o.
(i -> m (o, DynamicScheduleT m i o)) -> DynamicScheduleT m i o
DynamicSchedule ((i -> m (o, DynamicScheduleT m i o)) -> DynamicScheduleT m i o)
-> (i -> m (o, DynamicScheduleT m i o)) -> DynamicScheduleT m i o
forall a b. (a -> b) -> a -> b
$ \i
i -> do
o
a <- i -> m o
f i
i
(o, DynamicScheduleT m i o) -> m (o, DynamicScheduleT m i o)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (o
a, (i -> m o) -> DynamicScheduleT m i o
forall (m :: * -> *) i o.
Monad m =>
(i -> m o) -> DynamicScheduleT m i o
accessDyn i -> m o
f)
delayDyn :: (Applicative m) => a -> DynamicScheduleT m a a
delayDyn :: forall (m :: * -> *) a.
Applicative m =>
a -> DynamicScheduleT m a a
delayDyn a
d = (a -> m (a, DynamicScheduleT m a a)) -> DynamicScheduleT m a a
forall (m :: * -> *) i o.
(i -> m (o, DynamicScheduleT m i o)) -> DynamicScheduleT m i o
DynamicSchedule ((a -> m (a, DynamicScheduleT m a a)) -> DynamicScheduleT m a a)
-> (a -> m (a, DynamicScheduleT m a a)) -> DynamicScheduleT m a a
forall a b. (a -> b) -> a -> b
$ \a
this -> (a, DynamicScheduleT m a a) -> m (a, DynamicScheduleT m a a)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a
d, a -> DynamicScheduleT m a a
forall (m :: * -> *) a.
Applicative m =>
a -> DynamicScheduleT m a a
delayDyn a
this)
newtype ScheduleT m i o = Schedule {forall (m :: * -> *) i o.
ScheduleT m i o
-> Components -> (DynamicScheduleT m i o, Components)
runSchedule' :: Components -> (DynamicScheduleT m i o, Components)}
deriving ((forall a b. (a -> b) -> ScheduleT m i a -> ScheduleT m i b)
-> (forall a b. a -> ScheduleT m i b -> ScheduleT m i a)
-> Functor (ScheduleT m i)
forall a b. a -> ScheduleT m i b -> ScheduleT m i a
forall a b. (a -> b) -> ScheduleT m i a -> ScheduleT m i b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
forall (m :: * -> *) i a b.
Functor m =>
a -> ScheduleT m i b -> ScheduleT m i a
forall (m :: * -> *) i a b.
Functor m =>
(a -> b) -> ScheduleT m i a -> ScheduleT m i b
$cfmap :: forall (m :: * -> *) i a b.
Functor m =>
(a -> b) -> ScheduleT m i a -> ScheduleT m i b
fmap :: forall a b. (a -> b) -> ScheduleT m i a -> ScheduleT m i b
$c<$ :: forall (m :: * -> *) i a b.
Functor m =>
a -> ScheduleT m i b -> ScheduleT m i a
<$ :: forall a b. a -> ScheduleT m i b -> ScheduleT m i a
Functor)
instance (Monad m) => Category (ScheduleT m) where
id :: forall a. ScheduleT m a a
id = (Components -> (DynamicScheduleT m a a, Components))
-> ScheduleT m a a
forall (m :: * -> *) i o.
(Components -> (DynamicScheduleT m i o, Components))
-> ScheduleT m i o
Schedule ((Components -> (DynamicScheduleT m a a, Components))
-> ScheduleT m a a)
-> (Components -> (DynamicScheduleT m a a, Components))
-> ScheduleT m a a
forall a b. (a -> b) -> a -> b
$ \Components
cs -> (DynamicScheduleT m a a
forall a. DynamicScheduleT m a a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id, Components
cs)
Schedule Components -> (DynamicScheduleT m b c, Components)
f . :: forall b c a. ScheduleT m b c -> ScheduleT m a b -> ScheduleT m a c
. Schedule Components -> (DynamicScheduleT m a b, Components)
g = (Components -> (DynamicScheduleT m a c, Components))
-> ScheduleT m a c
forall (m :: * -> *) i o.
(Components -> (DynamicScheduleT m i o, Components))
-> ScheduleT m i o
Schedule ((Components -> (DynamicScheduleT m a c, Components))
-> ScheduleT m a c)
-> (Components -> (DynamicScheduleT m a c, Components))
-> ScheduleT m a c
forall a b. (a -> b) -> a -> b
$ \Components
cs ->
let (DynamicScheduleT m a b
g', Components
cs') = Components -> (DynamicScheduleT m a b, Components)
g Components
cs
(DynamicScheduleT m b c
f', Components
cs'') = Components -> (DynamicScheduleT m b c, Components)
f Components
cs'
in (DynamicScheduleT m b c
f' DynamicScheduleT m b c
-> DynamicScheduleT m a b -> DynamicScheduleT m a c
forall b c a.
DynamicScheduleT m b c
-> DynamicScheduleT m a b -> DynamicScheduleT m a c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. DynamicScheduleT m a b
g', Components
cs'')
instance (Monad m) => Arrow (ScheduleT m) where
arr :: forall b c. (b -> c) -> ScheduleT m b c
arr b -> c
f = (Components -> (DynamicScheduleT m b c, Components))
-> ScheduleT m b c
forall (m :: * -> *) i o.
(Components -> (DynamicScheduleT m i o, Components))
-> ScheduleT m i o
Schedule ((Components -> (DynamicScheduleT m b c, Components))
-> ScheduleT m b c)
-> (Components -> (DynamicScheduleT m b c, Components))
-> ScheduleT m b c
forall a b. (a -> b) -> a -> b
$ \Components
cs -> ((b -> c) -> DynamicScheduleT m b c
forall b c. (b -> c) -> DynamicScheduleT m b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr b -> c
f, Components
cs)
first :: forall b c d. ScheduleT m b c -> ScheduleT m (b, d) (c, d)
first (Schedule Components -> (DynamicScheduleT m b c, Components)
f) = (Components -> (DynamicScheduleT m (b, d) (c, d), Components))
-> ScheduleT m (b, d) (c, d)
forall (m :: * -> *) i o.
(Components -> (DynamicScheduleT m i o, Components))
-> ScheduleT m i o
Schedule ((Components -> (DynamicScheduleT m (b, d) (c, d), Components))
-> ScheduleT m (b, d) (c, d))
-> (Components -> (DynamicScheduleT m (b, d) (c, d), Components))
-> ScheduleT m (b, d) (c, d)
forall a b. (a -> b) -> a -> b
$ \Components
cs -> let (DynamicScheduleT m b c
f', Components
cs') = Components -> (DynamicScheduleT m b c, Components)
f Components
cs in (DynamicScheduleT m b c -> DynamicScheduleT m (b, d) (c, d)
forall b c d.
DynamicScheduleT m b c -> DynamicScheduleT m (b, d) (c, d)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first DynamicScheduleT m b c
f', Components
cs')
instance (MonadFix m) => ArrowLoop (ScheduleT m) where
loop :: forall b d c. ScheduleT m (b, d) (c, d) -> ScheduleT m b c
loop (Schedule Components -> (DynamicScheduleT m (b, d) (c, d), Components)
f) = (Components -> (DynamicScheduleT m b c, Components))
-> ScheduleT m b c
forall (m :: * -> *) i o.
(Components -> (DynamicScheduleT m i o, Components))
-> ScheduleT m i o
Schedule ((Components -> (DynamicScheduleT m b c, Components))
-> ScheduleT m b c)
-> (Components -> (DynamicScheduleT m b c, Components))
-> ScheduleT m b c
forall a b. (a -> b) -> a -> b
$ \Components
cs -> let (DynamicScheduleT m (b, d) (c, d)
f', Components
cs') = Components -> (DynamicScheduleT m (b, d) (c, d), Components)
f Components
cs in (DynamicScheduleT m (b, d) (c, d) -> DynamicScheduleT m b c
forall b d c.
DynamicScheduleT m (b, d) (c, d) -> DynamicScheduleT m b c
forall (a :: * -> * -> *) b d c.
ArrowLoop a =>
a (b, d) (c, d) -> a b c
loop DynamicScheduleT m (b, d) (c, d)
f', Components
cs')
instance (Monad m) => ArrowAccessSchedule Bundle (AccessT m) (Schedule m) where
access :: forall i o. (i -> AccessT m o) -> Schedule m i o
access i -> AccessT m o
f = (Components -> (DynamicScheduleT (AccessT m) i o, Components))
-> ScheduleT (AccessT m) i o
forall (m :: * -> *) i o.
(Components -> (DynamicScheduleT m i o, Components))
-> ScheduleT m i o
Schedule ((Components -> (DynamicScheduleT (AccessT m) i o, Components))
-> ScheduleT (AccessT m) i o)
-> (Components -> (DynamicScheduleT (AccessT m) i o, Components))
-> ScheduleT (AccessT m) i o
forall a b. (a -> b) -> a -> b
$ \Components
cs -> ((i -> AccessT m o) -> DynamicScheduleT (AccessT m) i o
forall (m :: * -> *) i o.
Monad m =>
(i -> m o) -> DynamicScheduleT m i o
accessDyn i -> AccessT m o
f, Components
cs)
instance (Monad m) => ArrowReaderSchedule (ReaderSystemT m) (Schedule m) where
reader :: forall i o. ReaderSystemT m i o -> Schedule m i o
reader = ReaderScheduleT (AccessT m) i o -> ScheduleT (AccessT m) i o
forall (m :: * -> *) i o.
Monad m =>
ReaderScheduleT m i o -> ScheduleT m i o
fromReaderSchedule (ReaderScheduleT (AccessT m) i o -> ScheduleT (AccessT m) i o)
-> (ReaderSystemT m i o -> ReaderScheduleT (AccessT m) i o)
-> ReaderSystemT m i o
-> ScheduleT (AccessT m) i o
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
. ReaderSystemT m i o -> ReaderScheduleT (AccessT m) i o
forall i o. ReaderSystemT m i o -> ReaderScheduleT (AccessT m) i o
forall (s :: * -> * -> *) (arr :: * -> * -> *) i o.
ArrowReaderSchedule s arr =>
s i o -> arr i o
reader
instance (Monad m) => ArrowSchedule (SystemT m) (Schedule m) where
system :: forall i o. SystemT m i o -> Schedule m i o
system SystemT m i o
s = (Components -> (DynamicScheduleT (AccessT m) i o, Components))
-> ScheduleT (AccessT m) i o
forall (m :: * -> *) i o.
(Components -> (DynamicScheduleT m i o, Components))
-> ScheduleT m i o
Schedule ((Components -> (DynamicScheduleT (AccessT m) i o, Components))
-> ScheduleT (AccessT m) i o)
-> (Components -> (DynamicScheduleT (AccessT m) i o, Components))
-> ScheduleT (AccessT m) i o
forall a b. (a -> b) -> a -> b
$ \Components
cs ->
let (DynamicSystemT m i o
dynS, ReadsWrites
_, Components
cs') = SystemT m i o
-> Components -> (DynamicSystemT m i o, ReadsWrites, Components)
forall (m :: * -> *) i o.
SystemT m i o
-> Components -> (DynamicSystemT m i o, ReadsWrites, Components)
runSystem SystemT m i o
s Components
cs
go :: DynamicSystemT m i o
-> i -> AccessT m (o, DynamicScheduleT (AccessT m) i o)
go DynamicSystemT m i o
dynSAcc i
i = StateT World m (o, DynamicScheduleT (AccessT m) i o)
-> AccessT m (o, DynamicScheduleT (AccessT m) i o)
forall (m :: * -> *) a. StateT World m a -> AccessT m a
AccessT (StateT World m (o, DynamicScheduleT (AccessT m) i o)
-> AccessT m (o, DynamicScheduleT (AccessT m) i o))
-> StateT World m (o, DynamicScheduleT (AccessT m) i o)
-> AccessT m (o, DynamicScheduleT (AccessT m) i o)
forall a b. (a -> b) -> a -> b
$ do
World
w <- StateT World m World
forall s (m :: * -> *). MonadState s m => m s
get
let (o
o, View
v, AccessT m ()
a, DynamicSystemT m i o
dynSAcc') = DynamicSystemT m i o
-> Entities -> i -> (o, View, AccessT m (), DynamicSystemT m i o)
forall (m :: * -> *) i o.
DynamicSystemT m i o
-> Entities -> i -> (o, View, AccessT m (), DynamicSystemT m i o)
runSystemDyn DynamicSystemT m i o
dynSAcc (World -> Entities
W.entities World
w) i
i
((), World
w') <- m ((), World) -> StateT World m ((), World)
forall (m :: * -> *) a. Monad m => m a -> StateT World m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m ((), World) -> StateT World m ((), World))
-> m ((), World) -> StateT World m ((), World)
forall a b. (a -> b) -> a -> b
$ AccessT m () -> World -> m ((), World)
forall (m :: * -> *) a.
Functor m =>
AccessT m a -> World -> m (a, World)
runAccessT AccessT m ()
a World
w {W.entities = V.unview v (W.entities w)}
World -> StateT World m ()
forall s (m :: * -> *). MonadState s m => s -> m ()
put World
w'
(o, DynamicScheduleT (AccessT m) i o)
-> StateT World m (o, DynamicScheduleT (AccessT m) i o)
forall a. a -> StateT World m a
forall (m :: * -> *) a. Monad m => a -> m a
return (o
o, (i -> AccessT m (o, DynamicScheduleT (AccessT m) i o))
-> DynamicScheduleT (AccessT m) i o
forall (m :: * -> *) i o.
(i -> m (o, DynamicScheduleT m i o)) -> DynamicScheduleT m i o
DynamicSchedule ((i -> AccessT m (o, DynamicScheduleT (AccessT m) i o))
-> DynamicScheduleT (AccessT m) i o)
-> (i -> AccessT m (o, DynamicScheduleT (AccessT m) i o))
-> DynamicScheduleT (AccessT m) i o
forall a b. (a -> b) -> a -> b
$ DynamicSystemT m i o
-> i -> AccessT m (o, DynamicScheduleT (AccessT m) i o)
go DynamicSystemT m i o
dynSAcc')
in ((i -> AccessT m (o, DynamicScheduleT (AccessT m) i o))
-> DynamicScheduleT (AccessT m) i o
forall (m :: * -> *) i o.
(i -> m (o, DynamicScheduleT m i o)) -> DynamicScheduleT m i o
DynamicSchedule ((i -> AccessT m (o, DynamicScheduleT (AccessT m) i o))
-> DynamicScheduleT (AccessT m) i o)
-> (i -> AccessT m (o, DynamicScheduleT (AccessT m) i o))
-> DynamicScheduleT (AccessT m) i o
forall a b. (a -> b) -> a -> b
$ DynamicSystemT m i o
-> i -> AccessT m (o, DynamicScheduleT (AccessT m) i o)
forall {m :: * -> *} {i} {o}.
Monad m =>
DynamicSystemT m i o
-> i -> AccessT m (o, DynamicScheduleT (AccessT m) i o)
go DynamicSystemT m i o
dynS, Components
cs')
fromReaderSchedule :: (Monad m) => ReaderScheduleT m i o -> ScheduleT m i o
fromReaderSchedule :: forall (m :: * -> *) i o.
Monad m =>
ReaderScheduleT m i o -> ScheduleT m i o
fromReaderSchedule ReaderScheduleT m i o
s = (Components -> (DynamicScheduleT m i o, Components))
-> ScheduleT m i o
forall (m :: * -> *) i o.
(Components -> (DynamicScheduleT m i o, Components))
-> ScheduleT m i o
Schedule ((Components -> (DynamicScheduleT m i o, Components))
-> ScheduleT m i o)
-> (Components -> (DynamicScheduleT m i o, Components))
-> ScheduleT m i o
forall a b. (a -> b) -> a -> b
$ \Components
cs ->
let (DynamicReaderScheduleT m i o
dynS, Components
cs') = ReaderScheduleT m i o
-> Components -> (DynamicReaderScheduleT m i o, Components)
forall (m :: * -> *) i o.
ReaderScheduleT m i o
-> Components -> (DynamicReaderScheduleT m i o, Components)
runReaderSchedule ReaderScheduleT m i o
s Components
cs in (DynamicReaderScheduleT m i o -> DynamicScheduleT m i o
forall (m :: * -> *) i o.
Monad m =>
DynamicReaderScheduleT m i o -> DynamicScheduleT m i o
fromDynReaderSchedule DynamicReaderScheduleT m i o
dynS, Components
cs')
delay :: (Monad m) => a -> Schedule m a a
delay :: forall (m :: * -> *) a. Monad m => a -> Schedule m a a
delay a
d = (Components -> (DynamicScheduleT (AccessT m) a a, Components))
-> ScheduleT (AccessT m) a a
forall (m :: * -> *) i o.
(Components -> (DynamicScheduleT m i o, Components))
-> ScheduleT m i o
Schedule ((Components -> (DynamicScheduleT (AccessT m) a a, Components))
-> ScheduleT (AccessT m) a a)
-> (Components -> (DynamicScheduleT (AccessT m) a a, Components))
-> ScheduleT (AccessT m) a a
forall a b. (a -> b) -> a -> b
$ \Components
cs -> (a -> DynamicScheduleT (AccessT m) a a
forall (m :: * -> *) a.
Applicative m =>
a -> DynamicScheduleT m a a
delayDyn a
d, Components
cs)
runSchedule :: (Monad m) => Schedule m i o -> World -> i -> m (o, DynamicSchedule m i o, World)
runSchedule :: forall (m :: * -> *) i o.
Monad m =>
Schedule m i o -> World -> i -> m (o, DynamicSchedule m i o, World)
runSchedule Schedule m i o
s World
w i
i = do
let (DynamicSchedule m i o
f, Components
cs) = Schedule m i o -> Components -> (DynamicSchedule m i o, Components)
forall (m :: * -> *) i o.
ScheduleT m i o
-> Components -> (DynamicScheduleT m i o, Components)
runSchedule' Schedule m i o
s (Entities -> Components
components (Entities -> Components) -> Entities -> Components
forall a b. (a -> b) -> a -> b
$ World -> Entities
W.entities World
w)
((o
o, DynamicSchedule m i o
f'), World
w') <- AccessT m (o, DynamicSchedule m i o)
-> World -> m ((o, DynamicSchedule m i o), World)
forall (m :: * -> *) a.
Functor m =>
AccessT m a -> World -> m (a, World)
runAccessT (DynamicSchedule m i o -> i -> AccessT m (o, DynamicSchedule m i o)
forall (m :: * -> *) i o.
DynamicScheduleT m i o -> i -> m (o, DynamicScheduleT m i o)
runScheduleDyn DynamicSchedule m i o
f i
i) World
w {W.entities = (W.entities w) {components = cs}}
(o, DynamicSchedule m i o, World)
-> m (o, DynamicSchedule m i o, World)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (o
o, DynamicSchedule m i o
f', World
w')
runSchedule_ :: (Monad m) => Schedule m () () -> m ()
runSchedule_ :: forall (m :: * -> *). Monad m => Schedule m () () -> m ()
runSchedule_ Schedule m () ()
s = m ((), DynamicSchedule m () (), World) -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Schedule m () ()
-> World -> () -> m ((), DynamicSchedule m () (), World)
forall (m :: * -> *) i o.
Monad m =>
Schedule m i o -> World -> i -> m (o, DynamicSchedule m i o, World)
runSchedule Schedule m () ()
s World
W.empty ())
forever :: Schedule IO i o -> (o -> IO ()) -> Schedule IO i ()
forever :: forall i o. Schedule IO i o -> (o -> IO ()) -> Schedule IO i ()
forever Schedule IO i o
s o -> IO ()
f = (Components -> (DynamicScheduleT (AccessT IO) i (), Components))
-> ScheduleT (AccessT IO) i ()
forall (m :: * -> *) i o.
(Components -> (DynamicScheduleT m i o, Components))
-> ScheduleT m i o
Schedule ((Components -> (DynamicScheduleT (AccessT IO) i (), Components))
-> ScheduleT (AccessT IO) i ())
-> (Components -> (DynamicScheduleT (AccessT IO) i (), Components))
-> ScheduleT (AccessT IO) i ()
forall a b. (a -> b) -> a -> b
$ \Components
cs ->
let (DynamicScheduleT (AccessT IO) i o
g, Components
cs') = Schedule IO i o
-> Components -> (DynamicScheduleT (AccessT IO) i o, Components)
forall (m :: * -> *) i o.
ScheduleT m i o
-> Components -> (DynamicScheduleT m i o, Components)
runSchedule' Schedule IO i o
s Components
cs
go :: i -> AccessT IO a
go i
i = StateT World IO a -> AccessT IO a
forall (m :: * -> *) a. StateT World m a -> AccessT m a
AccessT (StateT World IO a -> AccessT IO a)
-> StateT World IO a -> AccessT IO a
forall a b. (a -> b) -> a -> b
$ do
World
w <- StateT World IO World
forall s (m :: * -> *). MonadState s m => m s
get
let go' :: DynamicScheduleT (AccessT IO) i o -> World -> t IO b
go' DynamicScheduleT (AccessT IO) i o
gAcc World
wAcc = do
((o
o, DynamicScheduleT (AccessT IO) i o
g'), World
wAcc') <- IO ((o, DynamicScheduleT (AccessT IO) i o), World)
-> t IO ((o, DynamicScheduleT (AccessT IO) i o), World)
forall (m :: * -> *) a. Monad m => m a -> t m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO ((o, DynamicScheduleT (AccessT IO) i o), World)
-> t IO ((o, DynamicScheduleT (AccessT IO) i o), World))
-> IO ((o, DynamicScheduleT (AccessT IO) i o), World)
-> t IO ((o, DynamicScheduleT (AccessT IO) i o), World)
forall a b. (a -> b) -> a -> b
$ AccessT IO (o, DynamicScheduleT (AccessT IO) i o)
-> World -> IO ((o, DynamicScheduleT (AccessT IO) i o), World)
forall (m :: * -> *) a.
Functor m =>
AccessT m a -> World -> m (a, World)
runAccessT (DynamicScheduleT (AccessT IO) i o
-> i -> AccessT IO (o, DynamicScheduleT (AccessT IO) i o)
forall (m :: * -> *) i o.
DynamicScheduleT m i o -> i -> m (o, DynamicScheduleT m i o)
runScheduleDyn DynamicScheduleT (AccessT IO) i o
gAcc i
i) World
wAcc
IO () -> t IO ()
forall (m :: * -> *) a. Monad m => m a -> t m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> t IO ()) -> IO () -> t IO ()
forall a b. (a -> b) -> a -> b
$ () -> IO ()
forall a. a -> IO a
evaluate (() -> IO ()) -> () -> IO ()
forall a b. (a -> b) -> a -> b
$ World -> ()
forall a. NFData a => a -> ()
rnf World
wAcc'
IO () -> t IO ()
forall (m :: * -> *) a. Monad m => m a -> t m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> t IO ()) -> IO () -> t IO ()
forall a b. (a -> b) -> a -> b
$ o -> IO ()
f o
o
DynamicScheduleT (AccessT IO) i o -> World -> t IO b
go' DynamicScheduleT (AccessT IO) i o
g' World
wAcc'
DynamicScheduleT (AccessT IO) i o -> World -> StateT World IO a
forall {t :: (* -> *) -> * -> *} {b}.
(Monad (t IO), MonadTrans t) =>
DynamicScheduleT (AccessT IO) i o -> World -> t IO b
go' DynamicScheduleT (AccessT IO) i o
g World
w
in ((i -> AccessT IO ((), DynamicScheduleT (AccessT IO) i ()))
-> DynamicScheduleT (AccessT IO) i ()
forall (m :: * -> *) i o.
(i -> m (o, DynamicScheduleT m i o)) -> DynamicScheduleT m i o
DynamicSchedule i -> AccessT IO ((), DynamicScheduleT (AccessT IO) i ())
forall {a}. i -> AccessT IO a
go, Components
cs')
forever_ :: Schedule IO i o -> Schedule IO i ()
forever_ :: forall i o. Schedule IO i o -> Schedule IO i ()
forever_ Schedule IO i o
s = Schedule IO i o -> (o -> IO ()) -> Schedule IO i ()
forall i o. Schedule IO i o -> (o -> IO ()) -> Schedule IO i ()
forever Schedule IO i o
s (IO () -> o -> IO ()
forall a b. a -> b -> a
const (IO () -> o -> IO ()) -> IO () -> o -> IO ()
forall a b. (a -> b) -> a -> b
$ () -> IO ()
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ())