packages feed

alms-0.6.0: examples/ex35-session-types-type-error.alms

(* An example with session types, including choice. (Type error) *)

#load "libthread"
#load "libsessiontype"

open SessionType

type 'a protocol = !'a; !'a; ?'a; 1
                   |+|
                   !'a; ?'a; 1

(* reuses channel *)
let server (c : int protocol dual channel) =
    match follow c with
    | Left c ->
        let (x, _) = recv c in
        let (y, c) = recv c in
          send c (x + y);
          ()
    | Right c ->
        let (x, c) = recv c in
          send c (0 - x);
          ()

let client c x y =
      let c = sel1 c in
      let c = send c x in
      let c = send c y in
      let (r, _) = recv c in
        r

let main x y =
  let rv = newRendezvous () in
    AThread.fork (fun () -> server (accept rv));
    client (request rv) x y

in print (main 3 4)