\ignore{ > {-# LANGUAGE MagicHash #-} > 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.