DIRECTORY
	FIFO,
	FIFOGuardian,
	Process,
	RandomCard,
	WF;

FIFODriver: MONITOR
	IMPORTS FIFO, FIFOGuardian, Process, RandomCard, WF = {

p,q,r: PROCESS;
i: CARDINAL;

RandomYield: PROC = {
	THROUGH [0..RandomCard.Choose[0,1]] DO
		Process.Yield[]
	ENDLOOP};
Reader: PROC = {
	WF.WF0["  Reader started.*n"];
	THROUGH [0..50) DO
		RandomYield[];
		UNTIL FIFO.DataAvQ[] DO RandomYield[] ENDLOOP;
		FIFOGuardian.SetReadRequest[TRUE];
		WF.WF1["%u  ", FIFO.GetDataOut[]];
		RandomYield[];
		FIFOGuardian.SetReadRequest[FALSE];
	ENDLOOP;
	WF.WF0["  Reader terminated.*n"];
	};
Writer: PROC = {
	WF.WF0[" Writer started.*n"];
	FOR i IN [0..50) DO
		RandomYield[];
		UNTIL FIFO.SpaceAvQ[] DO RandomYield[] ENDLOOP;
		FIFOGuardian.SetDataIn[i];
		FIFOGuardian.SetWriteRequest[TRUE];
		WF.WF1["%u-  ", i];
		RandomYield[];
		FIFOGuardian.SetWriteRequest[FALSE];
	ENDLOOP;
	WF.WF0[" Writer terminated.*n"];
	};

[] ← RandomCard.InitRandom[-1];
START FIFO.FIFOImpl;
r ← FORK FIFO.Main[];
FIFO.SetInit[FALSE];
p ← FORK Reader[];
q ← FORK Writer[];

[] ← JOIN p;
[] ← JOIN q;
}.