<<>> <> <> <> <> <> <> DIRECTORY List USING [Assoc, PutAssoc], MakeDo USING [GetInfoProc, NodeRep], MakeDoPrivate USING [ActionRep, Node, NodeClass, NodeClassRep, NodeRep], Rope, SymTab; MakeDoNodeProps: CEDAR MONITOR IMPORTS List, SymTab EXPORTS MakeDo <> <> <> = BEGIN OPEN MakeDo, MakeDoPrivate; ROPE: TYPE = Rope.ROPE; NodeRep: PUBLIC TYPE = MakeDoPrivate.NodeRep; ActionRep: PUBLIC TYPE = MakeDoPrivate.ActionRep; NodeClassRep: PUBLIC TYPE = MakeDoPrivate.NodeClassRep; GetProp: PUBLIC ENTRY PROC [n: Node, prop: REF ANY] RETURNS [val: REF ANY] = { ENABLE UNWIND => {}; val _ List.Assoc[prop, n.props]; }; SetProp: PUBLIC ENTRY PROC [n: Node, prop, val: REF ANY] = { ENABLE UNWIND => {}; n.props _ List.PutAssoc[prop, val, n.props]; }; DeclareNodeClass : PUBLIC ENTRY PROC [ name: ROPE, CanonizeName: PROC [ROPE] RETURNS [ROPE], GetInfo: GetInfoProc ] RETURNS [nodeClass: NodeClass] = { nodeClass _ NEW [NodeClassRep _ [name, CanonizeName, GetInfo]]; [] _ nodeClasses.Store[name, nodeClass]; }; PublicPartsOfNodeClass: PUBLIC PROC [nc: NodeClass] RETURNS [ name: ROPE, CanonizeName: PROC [ROPE] RETURNS [ROPE], GetInfo: GetInfoProc ] = { RETURN [nc.name, nc.CanonizeName, nc.GetInfo]; }; LookupNodeClass: PUBLIC PROC [className: ROPE] RETURNS [class: NodeClass] = { class _ NARROW[nodeClasses.Fetch[className].val]; }; nodeClasses: SymTab.Ref _ SymTab.Create[case: TRUE]; END.