module H.Chan
  ( ReadChan()
  , WriteChan()
  , RChan(..)
  , WChan(..)
  , RWChan()
  , splitChan
  , newSplitChan
  , C.Chan
  , C.newChan
  ) where

import qualified Control.Concurrent.Chan as C

import H.IO
import H.Prelude

newtype ReadChan a = ReadChan (IO a)

newtype WriteChan a = WriteChan (a -> IO ())

class RChan chan where
  readChan :: chan a -> IO a

class WChan chan where
  writeChan :: chan a -> a -> IO ()

class (RChan chan, WChan chan) => RWChan chan where

splitChan :: C.Chan a -> (ReadChan a, WriteChan a)
splitChan chan = (ReadChan (C.readChan chan), WriteChan (C.writeChan chan))

newSplitChan :: IO (ReadChan a, WriteChan a)
newSplitChan = splitChan <$> C.newChan

instance RChan ReadChan where
  readChan (ReadChan r) = r

instance WChan WriteChan where
  writeChan (WriteChan w) = w

instance RChan C.Chan where
  readChan = C.readChan

instance WChan C.Chan where
  writeChan = C.writeChan

instance RWChan C.Chan where