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.