ANY LOOP_ITEM NONE
class interface SIMPLE_BACKGROUND_JOB
   -- Describe job to be executed in the background, when there nothing
   -- more important to do. Such job is ready to run at any time.

creation
   set_work (t: FUNCTION[ANY,TUPLE,BOOLEAN]; tr: PROCEDURE[ANY,TUPLE]; prio: INTEGER)
      -- t has to return True while continue
      require
         t /= Void;
         prio /= Minimum_integer
      ensure
         priority = prio

feature(s) from JOB
   priority: INTEGER
      -- Never change priority after job inserted in loop_item.
      -- Priority should only be set at creation time.

feature(s) from JOB
   prepare (ready: READY_DESCRIPTION)
      -- use ready to descibe condition that make this job ready
      -- to continue.
      require
         ready /= Void;
         not ready.queryable

   is_ready (ready: READY_DESCRIPTION): BOOLEAN
      -- check if this job is ready to continue his work
      require
         ready /= Void;
         ready.queryable

   continue
      -- Continue to do the job
      -- The work to do has to be small work and non blocking, it
      -- will continue on next call

   done: BOOLEAN
      -- done returns True when the job is finished. Then the
      -- job may be restart(ed) if it need to run again.

   restart
      -- Configure the job like the initial state.
      -- Example: when some window dialog appears second time, all
      -- jobs from this window are restarted.
      require
         done
      ensure
         not done

   infix "<" (other: JOB): BOOLEAN

feature(s) from SIMPLE_BACKGROUND_JOB
   set_work (t: FUNCTION[ANY,TUPLE,BOOLEAN]; tr: PROCEDURE[ANY,TUPLE]; prio: INTEGER)
      -- t has to return True while continue
      require
         t /= Void;
         prio /= Minimum_integer
      ensure
         priority = prio


invariant

    priority /= Minimum_integer;

end of SIMPLE_BACKGROUND_JOB