-- Stone 26-Jun-81 15:28:54 -- Cedar version:18-Jun-81 14:24:37 -- Ordered pairs; building and searching -- Nearly the same as Relations, written by Rick Tiberi DIRECTORY PairList; PairListImpl: PROGRAM EXPORTS PairList = BEGIN OPEN PairList; NotFound: PUBLIC SIGNAL = CODE; CreateRelation: PUBLIC PROCEDURE RETURNS [relation: Relation] = BEGIN relation _ NEW[RelationHead]; END; AddPair: PUBLIC PROCEDURE [relation: Relation, left, right: REF ANY] = BEGIN pair: REF Pair _ NEW[Pair]; pair.left _ left; pair.right _ right; pair.link _ relation.first; relation.first _ pair; END; Left: PUBLIC PROCEDURE[relation: Relation, equals: EqualProc, right: REF ANY] RETURNS [left: REF ANY] = BEGIN notFound: BOOLEAN _ TRUE; IsRight: PROCEDURE [leftPart, rightPart: REF ANY] = BEGIN IF equals[right,rightPart] THEN {left_leftPart; notFound_ FALSE}; END; ForAllPairs[relation, IsRight]; IF notFound THEN SIGNAL NotFound; END; Right: PUBLIC PROCEDURE[relation: Relation, equals: EqualProc, left: REF ANY] RETURNS [right: REF ANY] = BEGIN notFound: BOOLEAN _ TRUE; IsLeft: PROCEDURE [leftPart, rightPart: REF ANY] = BEGIN IF equals[left,leftPart] THEN {right_rightPart; notFound_ FALSE}; END; ForAllPairs[relation, IsLeft]; IF notFound THEN SIGNAL NotFound; END; ForAllPairs: PUBLIC PROCEDURE[relation: Relation, do: PROCEDURE[leftPart, rightPart: REF ANY]] = BEGIN pair: REF Pair _ NIL; IF relation=NIL THEN RETURN; FOR pair _ relation.first, pair.link UNTIL pair=NIL DO do[pair.left, pair.right] ENDLOOP; END; DestroyRelation: PUBLIC PROCEDURE[relation: Relation] = BEGIN pair, next: REF Pair _ NIL; IF relation=NIL THEN RETURN; FOR pair _ relation.first, next UNTIL pair=NIL DO next _ pair.link; ENDLOOP; END; END.