-------------------------------------------------------------------------------
-- 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 { forall a. GameIO a -> IO a
runGIO :: IO a }
                 deriving (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
<$ :: forall a b. a -> GameIO b -> GameIO a
$c<$ :: forall a b. a -> GameIO b -> GameIO a
fmap :: forall a b. (a -> b) -> GameIO a -> GameIO b
$cfmap :: forall a b. (a -> b) -> GameIO a -> GameIO b
Functor, Functor GameIO
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
<* :: forall a b. GameIO a -> GameIO b -> GameIO a
$c<* :: forall a b. GameIO a -> GameIO b -> GameIO a
*> :: forall a b. GameIO a -> GameIO b -> GameIO b
$c*> :: forall a b. GameIO a -> GameIO b -> GameIO b
liftA2 :: forall a b c. (a -> b -> c) -> GameIO a -> GameIO b -> GameIO c
$cliftA2 :: forall a b c. (a -> b -> c) -> GameIO a -> GameIO b -> GameIO c
<*> :: forall a b. GameIO (a -> b) -> GameIO a -> GameIO b
$c<*> :: forall a b. GameIO (a -> b) -> GameIO a -> GameIO b
pure :: forall a. a -> GameIO a
$cpure :: forall a. a -> GameIO a
Applicative, Applicative GameIO
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 :: forall a. a -> GameIO a
$creturn :: forall a. a -> GameIO a
>> :: forall a b. GameIO a -> GameIO b -> GameIO b
$c>> :: forall a b. GameIO a -> GameIO b -> GameIO b
>>= :: forall a b. GameIO a -> (a -> GameIO b) -> GameIO b
$c>>= :: forall a b. GameIO a -> (a -> GameIO b) -> GameIO b
Monad,
                           Monad GameIO
forall a. IO a -> GameIO a
forall (m :: * -> *).
Monad m -> (forall a. IO a -> m a) -> MonadIO m
liftIO :: forall a. IO a -> GameIO a
$cliftIO :: forall a. IO a -> GameIO a
T.MonadIO,
                           Monad GameIO
forall e a. Exception e => e -> GameIO a
forall (m :: * -> *).
Monad m -> (forall e a. Exception e => e -> m a) -> MonadThrow m
throwM :: forall e a. Exception e => e -> GameIO a
$cthrowM :: forall e a. Exception e => e -> GameIO a
MC.MonadThrow, MonadThrow GameIO
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 :: forall e a. Exception e => GameIO a -> (e -> GameIO a) -> GameIO a
$ccatch :: forall e a. Exception e => GameIO a -> (e -> GameIO a) -> GameIO a
MC.MonadCatch, MonadCatch GameIO
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 :: forall a b c.
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 b.
((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 b.
((forall a. GameIO a -> GameIO a) -> GameIO b) -> GameIO b
$cmask :: forall b.
((forall a. GameIO a -> GameIO a) -> GameIO b) -> GameIO b
MC.MonadMask)