--File: SetImpl.mesa
Last Edited by: CSChow, January 28, 1985 2:34:40 am PST
Preas, August 2, 1986 8:15:49 pm PDT
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: BOOLFALSE] ={
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.