<<--File: SetImpl.mesa>> <> <> DIRECTORY List, Set; SetImpl: CEDAR PROGRAM IMPORTS List EXPORTS Set = BEGIN OPEN Set; New: PUBLIC PROC [] RETURNS [Handle] ={ RETURN [NEW[HandleRec _ [NIL]]] }; --Create Put: PUBLIC PROC[han: Handle, e: REF ANY] RETURNS [BOOL] ={ IF ~List.Memb[e, han.elements] THEN han.elements _ CONS[e, han.elements]; RETURN[~List.Memb[e, han.elements]] };-- Put Enumerate: PUBLIC PROC[han: Handle, action: EachEltAction] RETURNS [stop: BOOL _ FALSE] ={ FOR list: LIST OF REF ANY _ han.elements, list.rest UNTIL stop OR list = NIL DO stop _ action[list.first] ENDLOOP; };--Enumerate Cardinality: PUBLIC PROC[han: Handle] RETURNS [NAT] ={ RETURN [NAT [List.Length[han.elements]]] };--Cardinality Nth: PUBLIC PROC[han: Handle, n: NAT] RETURNS [REF ANY] ={ RETURN [List.NthElement[han.elements, n]] };--Nth Difference: PUBLIC PROC[han1, han2: Handle] RETURNS [Handle] ={ RETURN [NEW[HandleRec _ [List.ListDifference[han1.elements, han2.elements]]]] };--Difference Remove: PUBLIC PROC[han: Handle, e: REF ANY] RETURNS [BOOL] ={ val: BOOL _ List.Memb[e, han.elements]; han.elements _ List.Remove[e, han.elements]; RETURN [val] };--Remove In: PUBLIC PROC[han: Handle, e: REF ANY] RETURNS [BOOL] ={ RETURN [List.Memb[e, han.elements]] };--In END.