packages feed

alms-0.4.11: src/Basis/Channel.hs

{-# 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 = (==)
  vppr _ = text "#<channel>"

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)
  ]