#![feature(rand)]
#[macro_use]
extern crate session_types;
extern crate rand;
use std::thread::spawn;
use session_types::*;
type Igo = Choose<Send<String, Eps>, Send<u64, Eps>>;
type Ugo = Offer<Recv<String, Eps>, Recv<u64, Eps>>;
fn srv(chan_one: Chan<(), Ugo>, chan_two: Chan<(), Ugo>) {
let _ign;
chan_select! {
_ign = chan_one.offer() => {
String => {
let (c, s) = chan_one.recv();
assert_eq!("Hello, World!".to_string(), s);
c.close();
match chan_two.offer() {
Left(c) => c.recv().0.close(),
Right(c) => c.recv().0.close(),
}
},
Number => {
chan_one.recv().0.close();
match chan_two.offer() {
Left(c) => c.recv().0.close(),
Right(c) => c.recv().0.close(),
}
}
},
_ign = chan_two.offer() => {
String => {
chan_two.recv().0.close();
match chan_one.offer() {
Left(c) => c.recv().0.close(),
Right(c) => c.recv().0.close(),
}
},
Number => {
chan_two.recv().0.close();
match chan_one.offer() {
Left(c) => c.recv().0.close(),
Right(c) => c.recv().0.close(),
}
}
}
}
}
fn cli(c: Chan<(), Igo>) {
c.sel1().send("Hello, World!".to_string()).close();
}
fn main() {
let (ca1, ca2) = session_channel();
let (cb1, cb2) = session_channel();
cb2.sel2().send(42).close();
spawn(move|| cli(ca2));
srv(ca1, cb1);
}