INTERFACEProvides a simple interface to implement a backup file.AppBackup ; <* PRAGMA LL *> IMPORT App, Rd, Time, Wr;
   After init is called, the read and write methods are
   called. 
   read is called once soon after init has returned and
   anytime SynchronousRead is called.
   write is called after self.changed is signaled, but not more
   often than wait seconds after the last write (unless SynchronousWrite
   was called).
 
TYPE
  T <: TPublic;
  TPublic = MUTEX OBJECT
    name: TEXT;
    log: App.Log;
  METHODS
    init(fileName: TEXT; wait: Time.T; log: App.Log): T RAISES {App.Error};
    modified();
    (* called to indicate the related data structure has changed and the
       backup file should be written within "self.wait" seconds. *)
    read(rd: Rd.T; initial: BOOLEAN) RAISES {App.Error};
    <* LL = self *>
    write(wr: Wr.T) RAISES {App.Error};
    <* LL = self *>
  END;
PROCEDURE SynchronousRead(t: T; initial: BOOLEAN) RAISES {App.Error};
PROCEDURE SynchronousWrite(t: T) RAISES {App.Error};
  <* LL < t *>
END AppBackup.