module Basis.Channel (Channel, entries) where import Data.Typeable (Typeable) import BasisUtils import AST import Value (Value, Valuable(..)) import qualified Data.Loc import qualified Basis.Channel.Haskell as C newtype Channel = Channel { unChannel :: C.Chan Value } deriving (Eq, Typeable) instance Valuable Channel where veq = (==) vppr _ = text "#" entries :: [Entry Raw] entries = [ dec [sgQ| type `a channel |], fun "new" -: [ty| all `a. unit -> `a channel |] -= \() -> Channel `fmap` C.newChan, fun "send" -: [ty| all `a. `a channel -> `a -> unit |] -= \c a -> do C.writeChan (unChannel c) a return (), fun "recv" -: [ty| all `a. `a channel -> `a |] -= \c -> C.readChan (unChannel c) ]