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 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; 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. v[Indigo]r>Rosemary.DF=>RoseEventsImpl.Mesa Last Edited by: Spreitzer, August 17, 1985 8:05:53 pm PDT ΚE– "cedar" style˜JšœΟmœ!™4J™9J˜JšΟk œD˜MJ˜codešΠbxœžœž˜Kšžœ˜Kšžœ ˜—K˜Kšžœžœ˜'K˜Kš œžœžœžœžœžœ˜2K˜Kšœ žœ6˜GK˜šΟn œžœ žœ žœžœžœžœžœ˜rKšœ˜Kšœ˜š žœ žœžœžœ žœž˜.˜šžœž˜KšœF˜FKšœM˜Mšžœž˜Kšœžœ3˜>Kšœ ˜ Kšžœ žœX˜gKšžœ˜——Kšžœ˜—šœ˜šžœž˜Kšœ9˜9Kšœ3˜3šžœž˜Kšœžœ.˜9Kšœ ˜ Kšžœ žœN˜]Kšžœ˜——Kšžœ˜—Kšžœ˜—Kšœžœ/˜;Kšœžœ'˜2Kšœ ˜ šžœ žœ˜Kšœ7˜7K˜7K˜—K˜—K˜š  œžœžœ žœžœžœžœ˜QKšž˜š œžœžœ˜Kšžœ˜—K˜ Kšžœ˜—K˜—Kšœ&žœ˜,Kšžœ˜—K˜š œžœžœ žœ žœžœžœžœžœžœ˜OKšž˜Kšœžœžœ˜Kšœžœžœ˜Kšœžœ˜#š œžœžœ˜@K˜ šžœžœžœž˜&šœ˜Kšœ ˜ Kšœ˜Kšœ"˜"K˜šœžœžœžœ˜#Kšœžœ˜ Kšœžœ˜2Kšžœ˜ ——Kšžœ˜—K˜—Kšžœžœžœ˜Kšœ&žœ˜-Kšœ"žœ˜)Kšžœžœžœžœ˜Kšžœ˜—K˜Kšžœ˜—…— 6ρ