<> <> <> DIRECTORY Basics, BasicTime, CedarProcess, FS, IO, List, MakeDo, MakeDoPrivate, RedBlackTree, Rope; MakeDoNodeProps: CEDAR MONITOR IMPORTS List, RedBlackTree, Rope EXPORTS MakeDo <> <> <> = BEGIN OPEN MakeDo, MakeDoPrivate; 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], GetTime: GetTimeProc ] RETURNS [nodeClass: NodeClass] = { nodeClass _ NEW [NodeClassRep _ [name, CanonizeName, GetTime]]; [] _ nodeClasses.Delete[name]; nodeClasses.Insert[nodeClass, name]; }; PublicPartsOfNodeClass: PUBLIC PROC [nc: NodeClass] RETURNS [ name: ROPE, CanonizeName: PROC [ROPE] RETURNS [ROPE], GetTime: GetTimeProc ] = { RETURN [nc.name, nc.CanonizeName, nc.GetTime]; }; LookupNodeClass: PUBLIC PROC [className: ROPE] RETURNS [class: NodeClass] = { class _ NARROW[nodeClasses.Lookup[className]]; }; nodeClasses: RedBlackTree.Table _ RedBlackTree.Create[GetNCKey, CompareNCs]; GetNCKey: PROC [data: REF ANY] RETURNS [key: ROPE] = { nc: NodeClass = NARROW[data]; key _ nc.name; }; CompareNCs: PROC [k, data: REF ANY] RETURNS [c: Basics.Comparison] --RedBlackTree.Compare-- = { k1: ROPE = NARROW[k]; k2: ROPE = GetNCKey[data]; c _ k1.Compare[k2]; }; END.