Class: Timers::Group

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

Constructor Details

#initializeGroup

Returns a new instance of Group.



23
24
25
26
27
28
29
30
31
# File 'lib/timers/group.rb', line 23

def initialize
	@events = Events.new

	@timers = Set.new
	@paused_timers = Set.new

	@interval = Interval.new
	@interval.start
end

Instance Attribute Details

#eventsObject (readonly)

Scheduled events:



34
35
36
# File 'lib/timers/group.rb', line 34

def events
  @events
end

#paused_timersObject (readonly)

Paused timers:



40
41
42
# File 'lib/timers/group.rb', line 40

def paused_timers
  @paused_timers
end

#timersObject (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

#cancelObject

Cancel all timers.



123
124
125
# File 'lib/timers/group.rb', line 123

def cancel
	@timers.dup.each(&:cancel)
end

#current_offsetObject

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

#pauseObject

Pause all timers.



104
105
106
# File 'lib/timers/group.rb', line 104

def pause
	@timers.dup.each(&:pause)
end

#resumeObject 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

#waitObject

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