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