m: --VoiceMessage-- Entity; -- how to declare a var of type voicemsg -- foo_ GetP[m, miCreated]; -- retrieve an attribute as a property, given the key -- fooList_ GetPList[m, irID]; -- retrieve list of attributes, given an ambiguous key -- rs: RelshipSet_ RelationSubset[interestRelation, LIST[[irUser, x], [irID, y]]]; -- assign to rs the set of relationships in interestRelation with user=x AND irID=y -- t: Relship_ NextRelship[rs]; -- iterate through that set. -- Example Walnut calls to Nuthatch primitives: 0. Walnut calls InitializeNuthatchUser to get a NuthatchUserHandle that will identify the client to Nuthatch in future calls. 1. During NewMail (actually, reading log & updating database), Walnut calls CatalogVoiceFile to associate a gvID with a VoiceID. 2. During MoveTo or AddTo, Walnut calls Walnuthatch.MoveTo[msgset, nuthatchUserHandle, RefID, time], which in turn calls Nuthatch.AddInterest. 3. During Expunge, Walnut calls Nuthatch.RemoveInterestEntry with the gvID of each destroyed message. 4. Nuthatch will register the button procs: RecordProc StopRecordProc AttachProc PlaybackProc PlayProc StopPlayProc KeepVoiceProc RemoveVoiceProc Walnuthatch.MoveTo [msgset, nuthatchUserHandle, RefID, time] MakeInterestEntry[ nuthatchUserHandle: Nuthatch.NuthatchUserHandle, voiceFileID: rope, -- optional RefID: rope, -- GVID time] RETURNS[] = -- Writes a log entry to create an entry in the InterestList relation for this voice file, associating the RefID with the voiceMessageID. {}; <<>> (b) During MoveTo, Finch is called with the gvID and message set movedTo. Walnuthatch.MoveTo tests for (msgset # active AND msgset # deleted)