MakeDoFinders.Mesa
Last tweaked by Mike Spreitzer on September 8, 1987 3:26:43 pm PDT
Eduardo Pelegri-Llopart October 21, 1988 1:22:01 pm PDT
JKF January 11, 1989 9:57:02 am PST
DIRECTORY
MakeDo USING [End, Finder, NodeRep],
MakeDoPrivate USING [ActionRep, NodeRep];
MakeDoFinders:
CEDAR
MONITOR
EXPORTS MakeDo, MakeDoPrivate
=
INVARIANT
finders lists Finders.
BEGIN OPEN MakeDo, MakeDoPrivate;
NodeRep: PUBLIC TYPE = MakeDoPrivate.NodeRep;
ActionRep: PUBLIC TYPE = MakeDoPrivate.ActionRep;
finders: LIST OF Finder ← NIL;
AddFinder:
PUBLIC
ENTRY
PROC [finder: Finder, end: End] =
BEGIN ENABLE UNWIND => {};
SELECT end
FROM
front => finders ← CONS[finder, finders];
back => {fl:
LIST
OF Finder;
IF finders = NIL THEN {finders ← LIST[finder]; RETURN};
FOR fl ← finders, fl.rest WHILE fl.rest # NIL DO NULL ENDLOOP;
fl.rest ← LIST[finder]};
ENDCASE => ERROR;
END;
EnumerateFinders:
PUBLIC
ENTRY
PROC [to:
PROC [Finder]
RETURNS [stop:
BOOL]] = {
ENABLE UNWIND => {};
FOR fl:
LIST
OF Finder ← finders, fl.rest
WHILE fl #
NIL
DO
IF to[fl.first] THEN EXIT;
ENDLOOP;
RETURN};
END.