<> <> <> <<>> <> DIRECTORY RedBlackTree, Rope, KeyNoteTokenFreqPerFileTable; KeyNoteTokenFreqPerFileTableImpl: CEDAR PROGRAM IMPORTS RedBlackTree, Rope EXPORTS KeyNoteTokenFreqPerFileTable = { ROPE: TYPE = Rope.ROPE; <> Compare: RedBlackTree.Compare = { RETURN [ Rope.Compare[s1: NARROW[k, ROPE], s2: NARROW[data, KeyNoteTokenFreqPerFileTable.UserData].token, case: FALSE]]; }; GetKey: RedBlackTree.GetKey = { RETURN [NARROW[data, KeyNoteTokenFreqPerFileTable.UserData].token]; }; <> Create: PUBLIC PROCEDURE [] RETURNS [table: KeyNoteTokenFreqPerFileTable.Table] = { table _ RedBlackTree.Create[getKey: GetKey, compare: Compare] }; DestroyTable: PUBLIC PROCEDURE [table: KeyNoteTokenFreqPerFileTable.Table] = { RedBlackTree.DestroyTable[self: table]; }; InsertAndBumpFrequncy: PUBLIC PROCEDURE [table: KeyNoteTokenFreqPerFileTable.Table, tokenName: ROPE] = { node: KeyNoteTokenFreqPerFileTable.Node _ RedBlackTree.LookupNode[self: table, lookupKey: tokenName]; <> IF node=NIL THEN { dataToInsert: KeyNoteTokenFreqPerFileTable.UserData _ NEW[KeyNoteTokenFreqPerFileTable.UserDataObject _ [token: tokenName, frequency: 1]]; RedBlackTree.Insert[self: table, dataToInsert: dataToInsert, insertKey: tokenName] } ELSE { WITH node.data SELECT FROM n: KeyNoteTokenFreqPerFileTable.UserData => { n.frequency _ n.frequency +1; }; ENDCASE => NULL; } }; EnumerateDecreasing: PUBLIC PROCEDURE [table: KeyNoteTokenFreqPerFileTable.Table, procToApply: KeyNoteTokenFreqPerFileTable.EachNode] = { RedBlackTree.EnumerateDecreasing[self: table, procToApply: procToApply]; }; LookupNextLarger: PUBLIC PROC [self: KeyNoteTokenFreqPerFileTable.Table, tokenName: ROPE] RETURNS [data: KeyNoteTokenFreqPerFileTable.UserData] = { data _ NARROW[RedBlackTree.LookupNextLarger[self: self, lookupKey: tokenName]]; }; Lookup: PUBLIC PROC [self: KeyNoteTokenFreqPerFileTable.Table, tokenName: ROPE] RETURNS [data: KeyNoteTokenFreqPerFileTable.UserData] = { data _ NARROW[RedBlackTree.Lookup[self: self, lookupKey: tokenName]]; }; <<>> }.