xref: /inferno-os/appl/lib/watchvars.b (revision 9b29ac7ea714507a9c0690620c02c8ca5ab25f90)
1implement Watchvars;
2include "watchvars.m";
3
4Watchvar[T].new(v: T): Watchvar
5{
6	e := Watchvar[T](chan[1] of (T, chan of T));
7	e.c <-= (v, chan[1] of T);
8	return e;
9}
10
11Watchvar[T].get(e: self Watchvar): T
12{
13	(v, ic) := <-e.c;
14	e.c <-= (v, ic);
15	return v;
16}
17
18Watchvar[T].set(e: self Watchvar, v: T)
19{
20	(nil, ic) := <-e.c;
21	ic <-= v;
22	e.c <-= (v, chan[1] of T);
23}
24
25Watchvar[T].wait(e: self Watchvar): T
26{
27	(v, ic) := <-e.c;
28	e.c <-= (v, ic);
29	v = <-ic;
30	ic <-= v;
31	return v;
32}
33
34Watchvar[T].waitc(e: self Watchvar): (T, chan of T)
35{
36	vic := <-e.c;
37	e.c <-= vic;
38	return vic;
39}
40
41Watchvar[T].waited(nil: self Watchvar, ic: chan of T, v: T)
42{
43	ic <-= v;
44}
45