DIRECTORY Asserting, Atom, IO, List, RoseEvents, RoseSimTypes, RoseWireTypes; RoseEventsImpl: CEDAR PROGRAM IMPORTS Asserting, Atom, List EXPORTS RoseEvents = BEGIN OPEN RoseWireTypes, RoseSimTypes; all: PUBLIC REF ANY _ NEW [ROPE _ "All watcheds"]; watchersKey: ATOM _ Atom.MakeAtom["Spreitzer January 6, 1984 8:07 pm"]; ForWatchers: PROC [event: ATOM, watched: REF ANY, do: PROC [WatcherList] RETURNS [WatcherList], replace: BOOL] = { wll: List.AList; wl: WatcherList; IF watched # NIL THEN WITH watched SELECT FROM roseWire: RoseWire => { SELECT roseWire.group FROM aboveLeaf => { FOR i: NAT IN [0 .. roseWire.subWires.length) DO ForWatchers[event, roseWire.subWires[i], do, replace]; ENDLOOP; }; leaf => { SELECT event FROM $ChangeEarly => roseWire.watchers[high] _ do[roseWire.watchers[high]]; $ChangeLate => roseWire.watchers[ordinary] _ do[roseWire.watchers[ordinary]]; ENDCASE => BEGIN wl _ NARROW[Asserting.FnVal[fn: event, from: roseWire.other]]; wl _ do[wl]; IF replace THEN roseWire.other _ Asserting.AssertFn1[fn: event, val: wl, inAdditionTo: roseWire.other]; END; }; belowLeaf => { IF roseWire.parent = NIL THEN ERROR; ForWatchers[event, roseWire.parent, do, replace]; }; ENDCASE => ERROR; RETURN}; rci: RoseCellInstance => { SELECT event FROM $Schedule => {rci.schedWatchers _ do[rci.schedWatchers]}; $Eval => {rci.evalWatchers _ do[rci.evalWatchers]}; ENDCASE => BEGIN wl _ NARROW[Asserting.FnVal[fn: event, from: rci.other]]; wl _ do[wl]; IF replace THEN rci.other _ Asserting.AssertFn1[fn: event, val: wl, inAdditionTo: rci.other]; END; RETURN}; ENDCASE; wll _ NARROW[Atom.GetProp[atom: event, prop: watchersKey]]; wl _ NARROW[List.Assoc[key: watched, aList: wll]]; wl _ do[wl]; IF replace THEN { wll _ List.PutAssoc[key: watched, val: wl, aList: wll]; Atom.PutProp[atom: event, prop: watchersKey, val: wll]; }; }; AddWatcher: PUBLIC PROC [event: ATOM, watcher: Watcher, watched: REF ANY _ NIL] = BEGIN Addit: PROC [ohne: WatcherList] RETURNS [mit: WatcherList] = {mit _ CONS[watcher, ohne]}; ForWatchers[event, watched, Addit, TRUE]; END; RemoveWatcher: PUBLIC PROC [event: ATOM, watcher: Watcher, watched: REF ANY _ NIL] = BEGIN RemoveIt: PROC [watchers: WatcherList] RETURNS [ohne: WatcherList] = { cur, prev: WatcherList _ NIL; ohne _ watchers; FOR cur _ watchers, cur.rest WHILE cur # NIL DO IF cur.first = watcher THEN { IF prev = NIL THEN ohne _ cur.rest ELSE prev.rest _ cur.rest; RETURN }; prev _ cur; ENDLOOP; }; ForWatchers[event, watched, RemoveIt, TRUE]; END; Notify: PUBLIC PROC [event: ATOM, watched: REF ANY _ NIL, arg: REF ANY _ NIL] = BEGIN handleAborted: BOOL = TRUE; abort: BOOLEAN _ FALSE; abortedWatchers: WatcherList _ NIL; NotifyEm: PROC [wl: WatcherList] RETURNS [same: WatcherList] = { same _ wl; FOR wl _ wl, wl.rest WHILE wl # NIL DO wl.first.Notify[ event: event, watched: watched, watcherData: wl.first.watcherData, arg: arg !ABORTED => IF handleAborted THEN { abort _ TRUE; abortedWatchers _ CONS[wl.first, abortedWatchers]; CONTINUE}]; ENDLOOP; }; IF watched = all THEN ERROR; ForWatchers[event, watched, NotifyEm, FALSE]; ForWatchers[event, all, NotifyEm, FALSE]; IF abort THEN ERROR ABORTED; END; END. x[Indigo]r>Rosemary.DF=>RoseEventsImpl.Mesa Last Edited by: Spreitzer, October 17, 1985 10:03:56 pm PDT Κ°– "cedar" style˜JšœΟmœ!™4J™;J˜JšΟk œD˜MJ˜codešΠbxœžœž˜Kšžœ˜Kšžœ ˜—K˜Kšžœžœ˜'K˜Kš œžœžœžœžœžœ˜2K˜Kšœ žœ6˜GK˜šΟn œžœ žœ žœžœžœžœžœ˜rKšœ˜Kšœ˜š žœ žœžœžœ žœž˜.˜šžœž˜˜šžœžœžœ!ž˜0K˜6Kšžœ˜—K˜—˜ šžœž˜KšœF˜FKšœM˜Mšžœž˜Kšœžœ3˜>Kšœ ˜ Kšžœ žœX˜gKšžœ˜——K˜—˜Kšžœžœžœžœ˜$K˜1K˜—Kšžœžœ˜—Kšžœ˜—šœ˜šžœž˜Kšœ9˜9Kšœ3˜3šžœž˜Kšœžœ.˜9Kšœ ˜ Kšžœ žœN˜]Kšžœ˜——Kšžœ˜—Kšžœ˜—Kšœžœ/˜;Kšœžœ'˜2Kšœ ˜ šžœ žœ˜Kšœ7˜7K˜7K˜—K˜—K˜š  œžœžœ žœžœžœžœ˜QKšž˜š œžœžœ˜