{-# LANGUAGE Unsafe #-}
{-# LANGUAGE NoImplicitPrelude, MagicHash, UnboxedTuples #-}
{-# OPTIONS_GHC -funbox-strict-fields #-}
{-# OPTIONS_HADDOCK hide #-}
module GHC.IOPort (
IOPort(..)
, newIOPort
, newEmptyIOPort
, readIOPort
, writeIOPort
, doubleReadException
) where
import GHC.Base
import GHC.Exception
import Text.Show
data IOPortException = IOPortException deriving Int -> IOPortException -> ShowS
[IOPortException] -> ShowS
IOPortException -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [IOPortException] -> ShowS
$cshowList :: [IOPortException] -> ShowS
show :: IOPortException -> String
$cshow :: IOPortException -> String
showsPrec :: Int -> IOPortException -> ShowS
$cshowsPrec :: Int -> IOPortException -> ShowS
Show
instance Exception IOPortException where
displayException :: IOPortException -> String
displayException IOPortException
IOPortException = String
"IOPortException"
doubleReadException :: SomeException
doubleReadException :: SomeException
doubleReadException = forall e. Exception e => e -> SomeException
toException IOPortException
IOPortException
data IOPort a = IOPort (IOPort# RealWorld a)
instance Eq (IOPort a) where
(IOPort IOPort# RealWorld a
ioport1#) == :: IOPort a -> IOPort a -> Bool
== (IOPort IOPort# RealWorld a
ioport2#) =
Int# -> Bool
isTrue# (forall d a. IOPort# d a -> IOPort# d a -> Int#
sameIOPort# IOPort# RealWorld a
ioport1# IOPort# RealWorld a
ioport2#)
newEmptyIOPort :: IO (IOPort a)
newEmptyIOPort :: forall a. IO (IOPort a)
newEmptyIOPort = forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO forall a b. (a -> b) -> a -> b
$ \ State# RealWorld
s# ->
case forall d a. State# d -> (# State# d, IOPort# d a #)
newIOPort# State# RealWorld
s# of
(# State# RealWorld
s2#, IOPort# RealWorld a
svar# #) -> (# State# RealWorld
s2#, forall a. IOPort# RealWorld a -> IOPort a
IOPort IOPort# RealWorld a
svar# #)
newIOPort :: a -> IO (IOPort a)
newIOPort :: forall a. a -> IO (IOPort a)
newIOPort a
value =
forall a. IO (IOPort a)
newEmptyIOPort forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \ IOPort a
ioport ->
forall a. IOPort a -> a -> IO Bool
writeIOPort IOPort a
ioport a
value forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>>
forall (m :: * -> *) a. Monad m => a -> m a
return IOPort a
ioport
readIOPort :: IOPort a -> IO a
readIOPort :: forall a. IOPort a -> IO a
readIOPort (IOPort IOPort# RealWorld a
ioport#) = forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO forall a b. (a -> b) -> a -> b
$ \ State# RealWorld
s# -> forall d a. IOPort# d a -> State# d -> (# State# d, a #)
readIOPort# IOPort# RealWorld a
ioport# State# RealWorld
s#
writeIOPort :: IOPort a -> a -> IO Bool
writeIOPort :: forall a. IOPort a -> a -> IO Bool
writeIOPort (IOPort IOPort# RealWorld a
ioport#) a
x = forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO forall a b. (a -> b) -> a -> b
$ \ State# RealWorld
s# ->
case forall d a. IOPort# d a -> a -> State# d -> (# State# d, Int# #)
writeIOPort# IOPort# RealWorld a
ioport# a
x State# RealWorld
s# of
(# State# RealWorld
s, Int#
0# #) -> (# State# RealWorld
s, Bool
False #)
(# State# RealWorld
s, Int#
_ #) -> (# State# RealWorld
s, Bool
True #)