<> <> DIRECTORY Rope, ViewerClasses; DifferenceAveragers: CEDAR DEFINITIONS = { ROPE: TYPE = Rope.ROPE; Viewer: TYPE = ViewerClasses.Viewer; Seconds: TYPE = INT; Averager: TYPE = REF AveragerPrivate; AveragerPrivate: TYPE; Create: PROC [ viewerInfo: ViewerClasses.ViewerRec _ [], samplePeriod, halfLife: Seconds, logMin, logMax: INT, Sample: PROC [clientData: REF ANY] RETURNS [add, subtract: REAL], clientData: REF ANY _ NIL ] RETURNS [Averager]; AsViewer: PROC [Averager] RETURNS [Viewer]; GetLayout: PROC [a: Averager, ancestor: Viewer] RETURNS [samplePeriodButton, halfLifeButton, bars: XRange --in client coords of ancestor (screen if NIL)--]; XRange: TYPE = RECORD [left, width: INTEGER]; }.