{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module System.IO.Straight (
SIO, sioToIO, ioToExceptionalSIO, unsafeInterleaveSIO,
ExceptionalT, IOException,
) where
import Control.Monad.Exception.Synchronous
(Exceptional(Success, Exception), ExceptionalT(ExceptionalT), )
import Control.Exception (IOException, try)
import Control.Monad.IO.Class (MonadIO, liftIO, )
import Control.Applicative (Applicative, )
import System.IO.Unsafe (unsafeInterleaveIO, )
newtype SIO a = SIO (IO a)
deriving (forall a b. a -> SIO b -> SIO a
forall a b. (a -> b) -> SIO a -> SIO 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 -> SIO b -> SIO a
$c<$ :: forall a b. a -> SIO b -> SIO a
fmap :: forall a b. (a -> b) -> SIO a -> SIO b
$cfmap :: forall a b. (a -> b) -> SIO a -> SIO b
Functor, Functor SIO
forall a. a -> SIO a
forall a b. SIO a -> SIO b -> SIO a
forall a b. SIO a -> SIO b -> SIO b
forall a b. SIO (a -> b) -> SIO a -> SIO b
forall a b c. (a -> b -> c) -> SIO a -> SIO b -> SIO 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. SIO a -> SIO b -> SIO a
$c<* :: forall a b. SIO a -> SIO b -> SIO a
*> :: forall a b. SIO a -> SIO b -> SIO b
$c*> :: forall a b. SIO a -> SIO b -> SIO b
liftA2 :: forall a b c. (a -> b -> c) -> SIO a -> SIO b -> SIO c
$cliftA2 :: forall a b c. (a -> b -> c) -> SIO a -> SIO b -> SIO c
<*> :: forall a b. SIO (a -> b) -> SIO a -> SIO b
$c<*> :: forall a b. SIO (a -> b) -> SIO a -> SIO b
pure :: forall a. a -> SIO a
$cpure :: forall a. a -> SIO a
Applicative, Applicative SIO
forall a. a -> SIO a
forall a b. SIO a -> SIO b -> SIO b
forall a b. SIO a -> (a -> SIO b) -> SIO 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 -> SIO a
$creturn :: forall a. a -> SIO a
>> :: forall a b. SIO a -> SIO b -> SIO b
$c>> :: forall a b. SIO a -> SIO b -> SIO b
>>= :: forall a b. SIO a -> (a -> SIO b) -> SIO b
$c>>= :: forall a b. SIO a -> (a -> SIO b) -> SIO b
Monad)
sioToIO :: SIO a -> IO a
sioToIO :: forall a. SIO a -> IO a
sioToIO (SIO IO a
x) = IO a
x
ioToExceptionalSIO :: IO a -> ExceptionalT IOException SIO a
ioToExceptionalSIO :: forall a. IO a -> ExceptionalT IOException SIO a
ioToExceptionalSIO =
forall e (m :: * -> *) a. m (Exceptional e a) -> ExceptionalT e m a
ExceptionalT forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. IO a -> SIO a
SIO forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall e a. e -> Exceptional e a
Exception forall e a. a -> Exceptional e a
Success) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall e a. Exception e => IO a -> IO (Either e a)
try
unsafeInterleaveSIO :: SIO a -> SIO a
unsafeInterleaveSIO :: forall a. SIO a -> SIO a
unsafeInterleaveSIO (SIO IO a
io) = forall a. IO a -> SIO a
SIO forall a b. (a -> b) -> a -> b
$ forall a. IO a -> IO a
unsafeInterleaveIO IO a
io
class Monad m => MonadSIO m where toSIO :: IO a -> m a
instance MonadSIO SIO where toSIO :: forall a. IO a -> SIO a
toSIO = forall a. IO a -> SIO a
SIO
class ContainsIOException e where fromIOException :: IOException -> e
instance ContainsIOException IOException where fromIOException :: IOException -> IOException
fromIOException = forall a. a -> a
id
instance (MonadSIO m, ContainsIOException e) =>
MonadIO (ExceptionalT e m) where
liftIO :: forall a. IO a -> ExceptionalT e m a
liftIO =
forall e (m :: * -> *) a. m (Exceptional e a) -> ExceptionalT e m a
ExceptionalT forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. MonadSIO m => IO a -> m a
toSIO forall b c a. (b -> c) -> (a -> b) -> a -> c
.
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (forall e a. e -> Exceptional e a
Exception forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall e. ContainsIOException e => IOException -> e
fromIOException) forall e a. a -> Exceptional e a
Success) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall e a. Exception e => IO a -> IO (Either e a)
try