\ignore{
>
> module Control.Concurrent.SimpleSession.UChan (
> UChan, newUChan, unsafeReadUChan, unsafeWriteUChan
> ) where
>
> import GHC.Exts
> import Control.Concurrent.SimpleSession.TChan
}
On top of |TChan| we have implemented |UChan|, an untyped,
synchronous channel:
> newtype UChan
\ignore{
> = CC (TChan Int)
>
> unUChan (CC c) = unsafeCoerce# c
>
> newUChan = newTChan >>= return . CC
> unsafeWriteUChan = writeTChan . unUChan
> unsafeReadUChan = readTChan . unUChan
}
Like |TChan|, |UChan| has three operations:
> newUChan :: IO UChan
> unsafeWriteUChan :: UChan -> a -> IO ()
> unsafeReadUChan :: UChan -> IO a
Note that since |UChan| is willing to send or receive a value of \emph{any}
type, it's unsafe unless we find some other way to restrict it.