{-# LANGUAGE GeneralizedNewtypeDeriving #-}

module Terminal.Game.Layer.Object.Narrate where

-- Narrate Monad, replay on screen from a GRec

import Terminal.Game.Layer.Object.Interface
import Terminal.Game.Layer.Object.Primitive
import Terminal.Game.Layer.Object.IO () -- MonadIo

import qualified Control.Monad.Catch as MC
import qualified Control.Monad.State as S
import qualified Control.Monad.Trans as T


newtype Narrate a = Narrate (S.StateT GRec IO a)
                deriving (forall a b. a -> Narrate b -> Narrate a
forall a b. (a -> b) -> Narrate a -> Narrate b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> Narrate b -> Narrate a
$c<$ :: forall a b. a -> Narrate b -> Narrate a
fmap :: forall a b. (a -> b) -> Narrate a -> Narrate b
$cfmap :: forall a b. (a -> b) -> Narrate a -> Narrate b
Functor, Functor Narrate
forall a. a -> Narrate a
forall a b. Narrate a -> Narrate b -> Narrate a
forall a b. Narrate a -> Narrate b -> Narrate b
forall a b. Narrate (a -> b) -> Narrate a -> Narrate b
forall a b c. (a -> b -> c) -> Narrate a -> Narrate b -> Narrate 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
<* :: forall a b. Narrate a -> Narrate b -> Narrate a
$c<* :: forall a b. Narrate a -> Narrate b -> Narrate a
*> :: forall a b. Narrate a -> Narrate b -> Narrate b
$c*> :: forall a b. Narrate a -> Narrate b -> Narrate b
liftA2 :: forall a b c. (a -> b -> c) -> Narrate a -> Narrate b -> Narrate c
$cliftA2 :: forall a b c. (a -> b -> c) -> Narrate a -> Narrate b -> Narrate c
<*> :: forall a b. Narrate (a -> b) -> Narrate a -> Narrate b
$c<*> :: forall a b. Narrate (a -> b) -> Narrate a -> Narrate b
pure :: forall a. a -> Narrate a
$cpure :: forall a. a -> Narrate a
Applicative, Applicative Narrate
forall a. a -> Narrate a
forall a b. Narrate a -> Narrate b -> Narrate b
forall a b. Narrate a -> (a -> Narrate b) -> Narrate 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
return :: forall a. a -> Narrate a
$creturn :: forall a. a -> Narrate a
>> :: forall a b. Narrate a -> Narrate b -> Narrate b
$c>> :: forall a b. Narrate a -> Narrate b -> Narrate b
>>= :: forall a b. Narrate a -> (a -> Narrate b) -> Narrate b
$c>>= :: forall a b. Narrate a -> (a -> Narrate b) -> Narrate b
Monad,
                          Monad Narrate
forall a. IO a -> Narrate a
forall (m :: * -> *).
Monad m -> (forall a. IO a -> m a) -> MonadIO m
liftIO :: forall a. IO a -> Narrate a
$cliftIO :: forall a. IO a -> Narrate a
T.MonadIO, S.MonadState GRec,
                          Monad Narrate
forall e a. Exception e => e -> Narrate a
forall (m :: * -> *).
Monad m -> (forall e a. Exception e => e -> m a) -> MonadThrow m
throwM :: forall e a. Exception e => e -> Narrate a
$cthrowM :: forall e a. Exception e => e -> Narrate a
MC.MonadThrow, MonadThrow Narrate
forall e a.
Exception e =>
Narrate a -> (e -> Narrate a) -> Narrate a
forall (m :: * -> *).
MonadThrow m
-> (forall e a. Exception e => m a -> (e -> m a) -> m a)
-> MonadCatch m
catch :: forall e a.
Exception e =>
Narrate a -> (e -> Narrate a) -> Narrate a
$ccatch :: forall e a.
Exception e =>
Narrate a -> (e -> Narrate a) -> Narrate a
MC.MonadCatch, MonadCatch Narrate
forall b.
((forall a. Narrate a -> Narrate a) -> Narrate b) -> Narrate b
forall a b c.
Narrate a
-> (a -> ExitCase b -> Narrate c)
-> (a -> Narrate b)
-> Narrate (b, c)
forall (m :: * -> *).
MonadCatch m
-> (forall b. ((forall a. m a -> m a) -> m b) -> m b)
-> (forall b. ((forall a. m a -> m a) -> m b) -> m b)
-> (forall a b c.
    m a -> (a -> ExitCase b -> m c) -> (a -> m b) -> m (b, c))
-> MonadMask m
generalBracket :: forall a b c.
Narrate a
-> (a -> ExitCase b -> Narrate c)
-> (a -> Narrate b)
-> Narrate (b, c)
$cgeneralBracket :: forall a b c.
Narrate a
-> (a -> ExitCase b -> Narrate c)
-> (a -> Narrate b)
-> Narrate (b, c)
uninterruptibleMask :: forall b.
((forall a. Narrate a -> Narrate a) -> Narrate b) -> Narrate b
$cuninterruptibleMask :: forall b.
((forall a. Narrate a -> Narrate a) -> Narrate b) -> Narrate b
mask :: forall b.
((forall a. Narrate a -> Narrate a) -> Narrate b) -> Narrate b
$cmask :: forall b.
((forall a. Narrate a -> Narrate a) -> Narrate b) -> Narrate b
MC.MonadMask)

instance MonadInput Narrate where
    startEvents :: TPS -> Narrate InputHandle
startEvents TPS
fps = forall (m :: * -> *) a. MonadIO m => IO a -> m a
T.liftIO forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *). MonadInput m => TPS -> m InputHandle
startEvents TPS
fps
    pollEvents :: MVar [Event] -> Narrate [Event]
pollEvents MVar [Event]
_ = forall s (m :: * -> *) a. MonadState s m => (s -> (a, s)) -> m a
S.state GRec -> ([Event], GRec)
getPolled
    stopEvents :: [ThreadId] -> Narrate ()
stopEvents [ThreadId]
ts = forall (m :: * -> *) a. MonadIO m => IO a -> m a
T.liftIO forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *). MonadInput m => [ThreadId] -> m ()
stopEvents [ThreadId]
ts
    areEventsOver :: Narrate Bool
areEventsOver = forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
S.gets GRec -> Bool
isOver

runReplay :: Narrate a -> GRec -> IO a
runReplay :: forall a. Narrate a -> GRec -> IO a
runReplay (Narrate StateT GRec IO a
s) GRec
k = forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m a
S.evalStateT StateT GRec IO a
s GRec
k