<<>> <> <> <> <> <<>> DIRECTORY PropList, UnsafePropList; PropListImpl: CEDAR PROGRAM IMPORTS UnsafePropList EXPORTS PropList ~ BEGIN OPEN PropList; ListContainer: PUBLIC TYPE = UnsafePropList.PropListContainer; IsPropList: PUBLIC PROC [x: REF] RETURNS [BOOL] = { RETURN [ISTYPE[x, REF ListContainer]] }; NarrowPropList: PUBLIC PROC [x: REF] RETURNS [List] = { RETURN [NARROW[x, REF ListContainer]] }; NewPropList: PUBLIC PROC [] RETURNS [List] = { RETURN [NEW[ListContainer]]; }; GetProp: PUBLIC PROC [list: List, key: REF] RETURNS [REF] = { RETURN [UnsafePropList.GetProp[LOOPHOLE[list], key]] }; PutProp: PUBLIC PROC [list: List, key, val: REF] RETURNS [old: REF] = { old ¬ UnsafePropList.PutProp[LOOPHOLE[list], key, val]; }; RemProp: PUBLIC PROC [list: List, key: REF] RETURNS [old: REF] = { old ¬ UnsafePropList.RemProp[LOOPHOLE[list], key]; }; TrustedAddNewProp: PUBLIC PROC [list: List, key, val: REF] = { UnsafePropList.TrustedAddNewProp[LOOPHOLE[list], key, val]; }; ConditionalPutProp: PUBLIC PROC [list: List, key, expect, new: REF] RETURNS [val: REF, done: BOOL] = { [val, done] _ UnsafePropList.ConditionalPutProp[LOOPHOLE[list], key, expect, new]; }; NiloutPropList: PUBLIC PROC [list: List] = { IF list#NIL THEN UnsafePropList.NiloutPropList[LOOPHOLE[list]]; }; GetPropOrInit: PUBLIC PROC [list: List, key: REF, init: InitializeProcType, data: REF ¬ NIL] RETURNS [val: REF, done: BOOL] = { [val, done] ¬ UnsafePropList.GetPropOrInit[LOOPHOLE[list], key, init, data]; }; Enumerate: PUBLIC PROC [list: List, map: EachPropProc, data: REF] RETURNS [quit: BOOL ¬ FALSE] = { RETURN [UnsafePropList.Enumerate[LOOPHOLE[list], map, data] ]; }; <> <> <<};>> <> <> <<[] ¬ UnsafePropList.Enumerate[LOOPHOLE[list], Copy1, copy];>> <<};>> <<>> NewCopy: PUBLIC PROC [list: List] RETURNS [copy: List ¬ NEW[ListContainer]] = { IF list#NIL THEN UnsafePropList.CopyPropList[LOOPHOLE[copy], LOOPHOLE[list]]; }; END.