Class: Timers::Group
- Inherits:
-
Object
- Object
- Timers::Group
- Extended by:
- Forwardable
- Includes:
- Enumerable
- Defined in:
- lib/timers/group.rb
Overview
A collection of timers which may fire at different times
Instance Attribute Summary collapse
-
#events ⇒ Object
readonly
Scheduled events:.
-
#paused_timers ⇒ Object
readonly
Paused timers:.
-
#timers ⇒ Object
readonly
Active timers:.
Instance Method Summary collapse
-
#after(interval, &block) ⇒ Object
Call the given block after the given interval.
-
#cancel ⇒ Object
Cancel all timers.
-
#current_offset ⇒ Object
The group’s current time.
-
#delay(seconds) ⇒ Object
Delay all timers.
-
#every(interval, recur = true, &block) ⇒ Object
Call the given block periodically at the given interval.
-
#fire(offset = current_offset) ⇒ Object
Fire all timers that are ready.
-
#initialize ⇒ Group
constructor
A new instance of Group.
-
#now_and_after(interval, &block) ⇒ Object
Call the given block immediately, and then after the given interval.
-
#now_and_every(interval, recur = true, &block) ⇒ Object
Call the given block immediately, and then periodically at the given interval.
-
#pause ⇒ Object
Pause all timers.
-
#resume ⇒ Object
(also: #continue)
Resume all timers.
-
#wait ⇒ Object
Wait for the next timer and fire it.
-
#wait_interval(offset = current_offset) ⇒ Object
Interval to wait until when the next timer will fire.
Constructor Details
Instance Attribute Details
#events ⇒ Object (readonly)
Scheduled events:
34 35 36 |
# File 'lib/timers/group.rb', line 34 def events @events end |
#paused_timers ⇒ Object (readonly)
Paused timers:
40 41 42 |
# File 'lib/timers/group.rb', line 40 def paused_timers @paused_timers end |
#timers ⇒ Object (readonly)
Active timers:
37 38 39 |
# File 'lib/timers/group.rb', line 37 def timers @timers end |
Instance Method Details
#after(interval, &block) ⇒ Object
Call the given block after the given interval. The first argument will be the time at which the group was asked to fire timers for.
44 45 46 |
# File 'lib/timers/group.rb', line 44 def after(interval, &block) Timer.new(self, interval, false, &block) end |
#cancel ⇒ Object
Cancel all timers.
123 124 125 |
# File 'lib/timers/group.rb', line 123 def cancel @timers.dup.each(&:cancel) end |
#current_offset ⇒ Object
The group’s current time.
128 129 130 |
# File 'lib/timers/group.rb', line 128 def current_offset @interval.to_f end |
#delay(seconds) ⇒ Object
Delay all timers.
116 117 118 119 120 |
# File 'lib/timers/group.rb', line 116 def delay(seconds) @timers.each do |timer| timer.delay(seconds) end end |
#every(interval, recur = true, &block) ⇒ Object
Call the given block periodically at the given interval. The first argument will be the time at which the group was asked to fire timers for.
57 58 59 |
# File 'lib/timers/group.rb', line 57 def every(interval, recur = true, &block) Timer.new(self, interval, recur, &block) end |
#fire(offset = current_offset) ⇒ Object
Fire all timers that are ready.
99 100 101 |
# File 'lib/timers/group.rb', line 99 def fire(offset = current_offset) @events.fire(offset) end |
#now_and_after(interval, &block) ⇒ Object
Call the given block immediately, and then after the given interval. The first argument will be the time at which the group was asked to fire timers for.
50 51 52 53 |
# File 'lib/timers/group.rb', line 50 def now_and_after(interval, &block) yield after(interval, &block) end |
#now_and_every(interval, recur = true, &block) ⇒ Object
Call the given block immediately, and then periodically at the given interval. The first argument will be the time at which the group was asked to fire timers for.
63 64 65 66 |
# File 'lib/timers/group.rb', line 63 def now_and_every(interval, recur = true, &block) yield every(interval, recur, &block) end |
#pause ⇒ Object
Pause all timers.
104 105 106 |
# File 'lib/timers/group.rb', line 104 def pause @timers.dup.each(&:pause) end |
#resume ⇒ Object Also known as: continue
Resume all timers.
109 110 111 |
# File 'lib/timers/group.rb', line 109 def resume @paused_timers.dup.each(&:resume) end |
#wait ⇒ Object
Wait for the next timer and fire it. Can take a block, which should behave like sleep(n), except that n may be nil (sleep forever) or a negative number (fire immediately after return).
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/timers/group.rb', line 71 def wait if block_given? yield wait_interval while (interval = wait_interval) && interval > 0 yield interval end else while (interval = wait_interval) && interval > 0 # We cannot assume that sleep will wait for the specified time, it might be +/- a bit. sleep interval end end fire end |
#wait_interval(offset = current_offset) ⇒ Object
Interval to wait until when the next timer will fire.
-
nil: no timers
-
-ve: timers expired already
-
0: timers ready to fire
-
+ve: timers waiting to fire
93 94 95 96 |
# File 'lib/timers/group.rb', line 93 def wait_interval(offset = current_offset) handle = @events.first handle.time - Float(offset) if handle end |