code: 9ferno

ref: da7d6df6faf18e289fe0f3f61524dcc7fddeef18
dir: /appl/lib/watchvars.b/

View raw version
implement Watchvars;
include "watchvars.m";

Watchvar[T].new(v: T): Watchvar
{
	e := Watchvar[T](chan[1] of (T, chan of T));
	e.c <-= (v, chan[1] of T);
	return e;
}

Watchvar[T].get(e: self Watchvar): T
{
	(v, ic) := <-e.c;
	e.c <-= (v, ic);
	return v;
}

Watchvar[T].set(e: self Watchvar, v: T)
{
	(nil, ic) := <-e.c;
	ic <-= v;
	e.c <-= (v, chan[1] of T);
}

Watchvar[T].wait(e: self Watchvar): T
{
	(v, ic) := <-e.c;
	e.c <-= (v, ic);
	v = <-ic;
	ic <-= v;
	return v;
}

Watchvar[T].waitc(e: self Watchvar): (T, chan of T)
{
	vic := <-e.c;
	e.c <-= vic;
	return vic;
}

Watchvar[T].waited(nil: self Watchvar, ic: chan of T, v: T)
{
	ic <-= v;
}