# System.Concurrency.Process

data ProcID : Type -> Type
  MkPID : Ptr -> ProcID msg
data Process : (msgType : Type) -> Type -> Type

  Type safe message passing programs. Parameterised over the type of
  message which can be send, and the return type.

  Lift : IO a -> Process msg a
create : Process msg () -> Process msg (ProcID msg)
msgWaiting : Process msg Bool

  Return whether a message is waiting in the queue

msgWaitingFrom : ProcID msg -> Process msg Bool

  Return whether a message is waiting in the queue from a specific sender

myID : Process msg (ProcID msg)

  Get current process ID

recv : Process msg msg

  Receive a message - blocks if there is no message waiting

recvFrom : ProcID msg -> Process msg (Maybe msg)

  Receive a message from specific sender - blocks if there is no message waiting
  Fails if the sender is no longer running

recvWithSender : Process msg (ProcID msg, msg)

  receive a message, and return with the sender's process ID.

run : Process msg x -> IO x
send : ProcID msg -> msg -> Process msg Bool

  Send a message to another process
  Returns whether the send was unsuccessful.