-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | MVars and Channels with distinguished input and output side
--   
--   MVars and Channels with distinguished input and output side. When
--   threads communicate via an MVar or a Chan there are often clearly
--   defined roles, which thread is the sender and which one is receiver.
--   We provide wrappers around the standard concurrency communication
--   channels that make the distinction clear and type safe.
--   
--   For example, if a function has a parameter of type <tt>TChan.In</tt>
--   then it is sure that it will only write to that channel. Additionally
--   if the compiler warns about an unused <tt>TChan.Out</tt> that was
--   created by <tt>TChan.new</tt> then you know that the receiver part of
--   your communication is missing.
--   
--   This package requires only Haskell 98.
--   
--   Related packages:
--   
--   <ul>
--   <li><tt>stm-split</tt>: transactional communication in <tt>STM</tt>
--   monad</li>
--   <li><tt>chan-split</tt>: follows the same idea as this package and
--   <tt>stm-split</tt> but requires multi-parameter type classes with
--   functional dependencies.</li>
--   <li><tt>privileged-concurrency</tt>:</li>
--   <li><tt>split-channel</tt>:</li>
--   </ul>
@package concurrent-split
@version 0.0.1

module Control.Concurrent.Split.Class
data In
data Out
class C chan
new :: C chan => IO (chan In a, chan Out a)
read :: C chan => chan Out a -> IO a
write :: C chan => chan In a -> a -> IO ()
new :: C chan => IO (chan In a, chan Out a)
read :: C chan => chan Out a -> IO a
write :: C chan => chan In a -> a -> IO ()

module Control.Concurrent.Split.Chan
data T dir a
type In = T In
type Out = T Out
new :: IO (In a, Out a)
read :: Out a -> IO a
write :: In a -> a -> IO ()
instance Control.Concurrent.Split.Class.C Control.Concurrent.Split.Chan.T

module Control.Concurrent.Split.MVar
data T dir a
type In = T In
type Out = T Out
newEmpty :: IO (In a, Out a)
take :: Out a -> IO a
tryTake :: Out a -> IO (Maybe a)
put :: In a -> a -> IO ()
tryPut :: In a -> a -> IO Bool
instance Control.Concurrent.Split.Class.C Control.Concurrent.Split.MVar.T
