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