{-# LANGUAGE DeriveDataTypeable, QuasiQuotes #-} module Basis.Channel (Channel, entries) where import Data.Typeable (Typeable) import BasisUtils import Syntax import Value (Value, Valuable(..)) import qualified Loc import qualified Syntax.Notable import qualified Syntax.Decl import qualified Basis.Channel.Haskell as C newtype Channel = Channel { unChannel :: C.Chan Value } deriving (Eq, Typeable) instance Valuable Channel where veq = (==) vpprPrec _ _ = text "#" entries :: [Entry Raw] entries = [ dec [$dc| 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) ]