-------------------------------------------------------------------------------
-- Layer 2 (mockable IO), as per
-- https://www.parsonsmatt.org/2018/03/22/three_layer_haskell_cake.html
-- 2019 Francesco Ariis GPLv3
-------------------------------------------------------------------------------

{-# LANGUAGE GeneralizedNewtypeDeriving #-}


module Terminal.Game.Layer.Object.GameIO where

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


newtype GameIO a = GameIO { GameIO a -> IO a
runGIO :: IO a }
                 deriving (a -> GameIO b -> GameIO a
(a -> b) -> GameIO a -> GameIO b
(forall a b. (a -> b) -> GameIO a -> GameIO b)
-> (forall a b. a -> GameIO b -> GameIO a) -> Functor GameIO
forall a b. a -> GameIO b -> GameIO a
forall a b. (a -> b) -> GameIO a -> GameIO b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> GameIO b -> GameIO a
$c<$ :: forall a b. a -> GameIO b -> GameIO a
fmap :: (a -> b) -> GameIO a -> GameIO b
$cfmap :: forall a b. (a -> b) -> GameIO a -> GameIO b
Functor, Functor GameIO
a -> GameIO a
Functor GameIO
-> (forall a. a -> GameIO a)
-> (forall a b. GameIO (a -> b) -> GameIO a -> GameIO b)
-> (forall a b c.
    (a -> b -> c) -> GameIO a -> GameIO b -> GameIO c)
-> (forall a b. GameIO a -> GameIO b -> GameIO b)
-> (forall a b. GameIO a -> GameIO b -> GameIO a)
-> Applicative GameIO
GameIO a -> GameIO b -> GameIO b
GameIO a -> GameIO b -> GameIO a
GameIO (a -> b) -> GameIO a -> GameIO b
(a -> b -> c) -> GameIO a -> GameIO b -> GameIO c
forall a. a -> GameIO a
forall a b. GameIO a -> GameIO b -> GameIO a
forall a b. GameIO a -> GameIO b -> GameIO b
forall a b. GameIO (a -> b) -> GameIO a -> GameIO b
forall a b c. (a -> b -> c) -> GameIO a -> GameIO b -> GameIO 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
<* :: GameIO a -> GameIO b -> GameIO a
$c<* :: forall a b. GameIO a -> GameIO b -> GameIO a
*> :: GameIO a -> GameIO b -> GameIO b
$c*> :: forall a b. GameIO a -> GameIO b -> GameIO b
liftA2 :: (a -> b -> c) -> GameIO a -> GameIO b -> GameIO c
$cliftA2 :: forall a b c. (a -> b -> c) -> GameIO a -> GameIO b -> GameIO c
<*> :: GameIO (a -> b) -> GameIO a -> GameIO b
$c<*> :: forall a b. GameIO (a -> b) -> GameIO a -> GameIO b
pure :: a -> GameIO a
$cpure :: forall a. a -> GameIO a
$cp1Applicative :: Functor GameIO
Applicative, Applicative GameIO
a -> GameIO a
Applicative GameIO
-> (forall a b. GameIO a -> (a -> GameIO b) -> GameIO b)
-> (forall a b. GameIO a -> GameIO b -> GameIO b)
-> (forall a. a -> GameIO a)
-> Monad GameIO
GameIO a -> (a -> GameIO b) -> GameIO b
GameIO a -> GameIO b -> GameIO b
forall a. a -> GameIO a
forall a b. GameIO a -> GameIO b -> GameIO b
forall a b. GameIO a -> (a -> GameIO b) -> GameIO 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 :: a -> GameIO a
$creturn :: forall a. a -> GameIO a
>> :: GameIO a -> GameIO b -> GameIO b
$c>> :: forall a b. GameIO a -> GameIO b -> GameIO b
>>= :: GameIO a -> (a -> GameIO b) -> GameIO b
$c>>= :: forall a b. GameIO a -> (a -> GameIO b) -> GameIO b
$cp1Monad :: Applicative GameIO
Monad,
                           Monad GameIO
Monad GameIO -> (forall a. IO a -> GameIO a) -> MonadIO GameIO
IO a -> GameIO a
forall a. IO a -> GameIO a
forall (m :: * -> *).
Monad m -> (forall a. IO a -> m a) -> MonadIO m
liftIO :: IO a -> GameIO a
$cliftIO :: forall a. IO a -> GameIO a
$cp1MonadIO :: Monad GameIO
T.MonadIO,
                           Monad GameIO
e -> GameIO a
Monad GameIO
-> (forall e a. Exception e => e -> GameIO a) -> MonadThrow GameIO
forall e a. Exception e => e -> GameIO a
forall (m :: * -> *).
Monad m -> (forall e a. Exception e => e -> m a) -> MonadThrow m
throwM :: e -> GameIO a
$cthrowM :: forall e a. Exception e => e -> GameIO a
$cp1MonadThrow :: Monad GameIO
MC.MonadThrow, MonadThrow GameIO
MonadThrow GameIO
-> (forall e a.
    Exception e =>
    GameIO a -> (e -> GameIO a) -> GameIO a)
-> MonadCatch GameIO
GameIO a -> (e -> GameIO a) -> GameIO a
forall e a. Exception e => GameIO a -> (e -> GameIO a) -> GameIO a
forall (m :: * -> *).
MonadThrow m
-> (forall e a. Exception e => m a -> (e -> m a) -> m a)
-> MonadCatch m
catch :: GameIO a -> (e -> GameIO a) -> GameIO a
$ccatch :: forall e a. Exception e => GameIO a -> (e -> GameIO a) -> GameIO a
$cp1MonadCatch :: MonadThrow GameIO
MC.MonadCatch, MonadCatch GameIO
MonadCatch GameIO
-> (forall b.
    ((forall a. GameIO a -> GameIO a) -> GameIO b) -> GameIO b)
-> (forall b.
    ((forall a. GameIO a -> GameIO a) -> GameIO b) -> GameIO b)
-> (forall a b c.
    GameIO a
    -> (a -> ExitCase b -> GameIO c)
    -> (a -> GameIO b)
    -> GameIO (b, c))
-> MonadMask GameIO
GameIO a
-> (a -> ExitCase b -> GameIO c)
-> (a -> GameIO b)
-> GameIO (b, c)
((forall a. GameIO a -> GameIO a) -> GameIO b) -> GameIO b
((forall a. GameIO a -> GameIO a) -> GameIO b) -> GameIO b
forall b.
((forall a. GameIO a -> GameIO a) -> GameIO b) -> GameIO b
forall a b c.
GameIO a
-> (a -> ExitCase b -> GameIO c)
-> (a -> GameIO b)
-> GameIO (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 :: GameIO a
-> (a -> ExitCase b -> GameIO c)
-> (a -> GameIO b)
-> GameIO (b, c)
$cgeneralBracket :: forall a b c.
GameIO a
-> (a -> ExitCase b -> GameIO c)
-> (a -> GameIO b)
-> GameIO (b, c)
uninterruptibleMask :: ((forall a. GameIO a -> GameIO a) -> GameIO b) -> GameIO b
$cuninterruptibleMask :: forall b.
((forall a. GameIO a -> GameIO a) -> GameIO b) -> GameIO b
mask :: ((forall a. GameIO a -> GameIO a) -> GameIO b) -> GameIO b
$cmask :: forall b.
((forall a. GameIO a -> GameIO a) -> GameIO b) -> GameIO b
$cp1MonadMask :: MonadCatch GameIO
MC.MonadMask)