em-priority-queue 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile.lock +6 -4
- data/README.md +58 -0
- data/em-priority-queue.gemspec +1 -0
- data/lib/em-priority-queue/priority_queue.rb +14 -2
- data/lib/em-priority-queue/version.rb +1 -1
- data/spec/em-priority-queue_spec.rb +148 -10
- data/spec/spec_helper.rb +7 -0
- metadata +21 -10
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
em-priority-queue (
|
4
|
+
em-priority-queue (1.1.0)
|
5
5
|
algorithms (~> 0.3.0)
|
6
6
|
eventmachine (>= 1.0.0.beta.3)
|
7
7
|
|
@@ -9,8 +9,11 @@ GEM
|
|
9
9
|
remote: http://rubygems.org/
|
10
10
|
specs:
|
11
11
|
algorithms (0.3.0)
|
12
|
+
chronic (0.6.6)
|
13
|
+
delorean (1.1.1)
|
14
|
+
chronic
|
12
15
|
diff-lcs (1.1.2)
|
13
|
-
eventmachine (1.0.0.beta.
|
16
|
+
eventmachine (1.0.0.beta.4)
|
14
17
|
rake (0.9.2)
|
15
18
|
rspec (2.6.0)
|
16
19
|
rspec-core (~> 2.6.0)
|
@@ -25,8 +28,7 @@ PLATFORMS
|
|
25
28
|
ruby
|
26
29
|
|
27
30
|
DEPENDENCIES
|
28
|
-
|
31
|
+
delorean (>= 1.1.1)
|
29
32
|
em-priority-queue!
|
30
|
-
eventmachine (>= 1.0.0.beta.3)
|
31
33
|
rake
|
32
34
|
rspec
|
data/README.md
CHANGED
@@ -59,6 +59,64 @@ EventMachine Priority Queue
|
|
59
59
|
responses[3] # Bob
|
60
60
|
|
61
61
|
|
62
|
+
**FIFO (first in, first out)**
|
63
|
+
|
64
|
+
When values have the same priority, you may want to use FIFO to prioritize even more. This way, em-priority-queue will pop the items in the order that they were pushed.
|
65
|
+
|
66
|
+
@q = EM::PriorityQueue.new(:fifo => true)
|
67
|
+
|
68
|
+
responses = []
|
69
|
+
EM.run do
|
70
|
+
@q.push("Mike", 20)
|
71
|
+
@q.push("Alex", 21)
|
72
|
+
@q.push("Bob", 20)
|
73
|
+
@q.push("Tim", 18)
|
74
|
+
@q.push("Carol", 20)
|
75
|
+
|
76
|
+
5.times do
|
77
|
+
@q.pop do |e|
|
78
|
+
responses << e
|
79
|
+
EM.stop if responses.size == 5
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
responses[0] # Alex
|
85
|
+
responses[1] # Mike
|
86
|
+
responses[2] # Bob
|
87
|
+
responses[3] # Carol
|
88
|
+
responses[4] # Tim
|
89
|
+
|
90
|
+
**FIFO with custom priority**
|
91
|
+
|
92
|
+
@q = EM::PriorityQueue.new(:fifo => true) {|x,y| x < y}
|
93
|
+
|
94
|
+
responses = []
|
95
|
+
EM.run do
|
96
|
+
|
97
|
+
|
98
|
+
@q.push("Mike", 20)
|
99
|
+
@q.push("Alex", 21)
|
100
|
+
@q.push("Bob", 20)
|
101
|
+
@q.push("Tim", 18)
|
102
|
+
@q.push("Carol", 20)
|
103
|
+
|
104
|
+
5.times do
|
105
|
+
@q.pop do |e|
|
106
|
+
responses << e
|
107
|
+
EM.stop if responses.size == 5
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
responses[0] # Tim
|
113
|
+
responses[1] # Mike
|
114
|
+
responses[2] # Bob
|
115
|
+
responses[3] # Carol
|
116
|
+
responses[4] # Alex
|
117
|
+
|
118
|
+
|
119
|
+
|
62
120
|
|
63
121
|
|
64
122
|
To see all examples/cases, see the spec file.
|
data/em-priority-queue.gemspec
CHANGED
@@ -2,9 +2,20 @@ module EventMachine
|
|
2
2
|
class PriorityQueue
|
3
3
|
include Enumerable
|
4
4
|
|
5
|
-
def initialize(&blk)
|
5
|
+
def initialize(opts={}, &blk)
|
6
6
|
blk ||= lambda { |x, y| (x <=> y) == 1 }
|
7
|
-
|
7
|
+
fifo_blk = nil
|
8
|
+
@fifo = !!opts[:fifo]
|
9
|
+
if @fifo
|
10
|
+
fifo_blk = lambda do |x,y|
|
11
|
+
if x[0] == y[0]
|
12
|
+
x[1] < y[1]
|
13
|
+
else
|
14
|
+
blk.call(x[0], y[0])
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
@heap = Containers::Heap.new(&(fifo_blk || blk))
|
8
19
|
@callbacks = []
|
9
20
|
end
|
10
21
|
|
@@ -13,6 +24,7 @@ module EventMachine
|
|
13
24
|
end
|
14
25
|
|
15
26
|
def push(obj, pri)
|
27
|
+
pri = [pri, Time.now.to_i] if @fifo
|
16
28
|
EM.schedule do
|
17
29
|
@heap.push(pri, obj)
|
18
30
|
@callbacks.shift.call(@heap.pop) until @heap.empty? || @callbacks.empty?
|
@@ -77,10 +77,10 @@ describe EventMachine::PriorityQueue do
|
|
77
77
|
@q.push("Tim", 18)
|
78
78
|
|
79
79
|
4.times do
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
80
|
+
@q.pop do |e|
|
81
|
+
responses << e
|
82
|
+
EM.stop if responses.size == 4
|
83
|
+
end
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
@@ -90,8 +90,89 @@ describe EventMachine::PriorityQueue do
|
|
90
90
|
responses[3].should == "Tim"
|
91
91
|
|
92
92
|
end
|
93
|
-
|
94
|
-
|
93
|
+
|
94
|
+
it "should create a fifo priority queue if specified" do
|
95
|
+
fifo_queue = EM::PriorityQueue.new(:fifo => true)
|
96
|
+
responses = []
|
97
|
+
EM.run do
|
98
|
+
fifo_queue.push("Checking1", 20)
|
99
|
+
Delorean.jump 30
|
100
|
+
fifo_queue.push("Other1", 16)
|
101
|
+
Delorean.jump 30
|
102
|
+
fifo_queue.push("Other2", 18)
|
103
|
+
Delorean.jump 30
|
104
|
+
fifo_queue.push("Checking2", 20)
|
105
|
+
Delorean.jump 30
|
106
|
+
fifo_queue.push("Checking3", 20)
|
107
|
+
Delorean.jump 30
|
108
|
+
fifo_queue.push("Checking4", 20)
|
109
|
+
Delorean.jump 30
|
110
|
+
fifo_queue.push("Checking5", 20)
|
111
|
+
Delorean.jump 30
|
112
|
+
fifo_queue.push("Checking6", 20)
|
113
|
+
Delorean.jump 30
|
114
|
+
fifo_queue.push("Other3", 33)
|
115
|
+
Delorean.jump 30
|
116
|
+
fifo_queue.push("Checking7", 20)
|
117
|
+
Delorean.jump 30
|
118
|
+
fifo_queue.push("Checking8", 20)
|
119
|
+
Delorean.jump 30
|
120
|
+
|
121
|
+
11.times do
|
122
|
+
fifo_queue.pop do |e|
|
123
|
+
responses << e
|
124
|
+
EM.stop if responses.size == 4
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
129
|
+
|
130
|
+
responses.first(5).should == ["Other3", "Checking1", "Checking2", "Checking3", "Checking4"]
|
131
|
+
|
132
|
+
end
|
133
|
+
it "should create a fifo priority queue if specified - custom ordering schema" do
|
134
|
+
fifo_queue = EM::PriorityQueue.new(:fifo => true) {|x,y| x < y}
|
135
|
+
responses = []
|
136
|
+
EM.run do
|
137
|
+
fifo_queue.push("Checking1", 20)
|
138
|
+
Delorean.jump 30
|
139
|
+
fifo_queue.push("Other1", 16)
|
140
|
+
Delorean.jump 30
|
141
|
+
fifo_queue.push("Other2", 18)
|
142
|
+
Delorean.jump 30
|
143
|
+
fifo_queue.push("Checking2", 20)
|
144
|
+
Delorean.jump 30
|
145
|
+
fifo_queue.push("Checking3", 20)
|
146
|
+
Delorean.jump 30
|
147
|
+
fifo_queue.push("Checking4", 20)
|
148
|
+
Delorean.jump 30
|
149
|
+
fifo_queue.push("Checking5", 20)
|
150
|
+
Delorean.jump 30
|
151
|
+
fifo_queue.push("Checking6", 20)
|
152
|
+
Delorean.jump 30
|
153
|
+
fifo_queue.push("Other3", 33)
|
154
|
+
Delorean.jump 30
|
155
|
+
fifo_queue.push("Checking7", 20)
|
156
|
+
Delorean.jump 30
|
157
|
+
fifo_queue.push("Checking8", 20)
|
158
|
+
Delorean.jump 30
|
159
|
+
|
160
|
+
11.times do
|
161
|
+
fifo_queue.pop do |e|
|
162
|
+
responses << e
|
163
|
+
EM.stop if responses.size == 4
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
end
|
168
|
+
|
169
|
+
responses.first(5).should == ["Other1", "Other2", "Checking1", "Checking2", "Checking3"]
|
170
|
+
|
171
|
+
end
|
172
|
+
|
173
|
+
|
174
|
+
it "should give elements in the order of their priority - custom ordering schema" do
|
175
|
+
@q = EM::PriorityQueue.new {|x,y| x < y}
|
95
176
|
responses = []
|
96
177
|
EM.run do
|
97
178
|
|
@@ -102,10 +183,10 @@ describe EventMachine::PriorityQueue do
|
|
102
183
|
@q.push("Tim", 18)
|
103
184
|
|
104
185
|
4.times do
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
186
|
+
@q.pop do |e|
|
187
|
+
responses << e
|
188
|
+
EM.stop if responses.size == 4
|
189
|
+
end
|
109
190
|
end
|
110
191
|
end
|
111
192
|
|
@@ -113,8 +194,65 @@ describe EventMachine::PriorityQueue do
|
|
113
194
|
responses[1].should == "Mike"
|
114
195
|
responses[2].should == "Alex"
|
115
196
|
responses[3].should == "Bob"
|
197
|
+
end
|
198
|
+
end
|
116
199
|
|
200
|
+
context "README demos" do
|
201
|
+
it "should run the first fifo example" do
|
202
|
+
@q = EM::PriorityQueue.new(:fifo => true)
|
203
|
+
|
204
|
+
responses = []
|
205
|
+
EM.run do
|
206
|
+
|
207
|
+
|
208
|
+
@q.push("Mike", 20)
|
209
|
+
@q.push("Alex", 21)
|
210
|
+
@q.push("Bob", 20)
|
211
|
+
@q.push("Tim", 18)
|
212
|
+
@q.push("Carol", 20)
|
213
|
+
|
214
|
+
5.times do
|
215
|
+
@q.pop do |e|
|
216
|
+
responses << e
|
217
|
+
EM.stop if responses.size == 5
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
responses[0].should == "Alex"
|
223
|
+
responses[1].should == "Mike"
|
224
|
+
responses[2].should == "Bob"
|
225
|
+
responses[3].should == "Carol"
|
226
|
+
responses[4].should == "Tim"
|
117
227
|
end
|
118
228
|
|
229
|
+
it "should run the second fifo example" do
|
230
|
+
@q = EM::PriorityQueue.new(:fifo => true) {|x,y| x < y}
|
231
|
+
|
232
|
+
responses = []
|
233
|
+
EM.run do
|
234
|
+
|
235
|
+
|
236
|
+
@q.push("Mike", 20)
|
237
|
+
@q.push("Alex", 21)
|
238
|
+
@q.push("Bob", 20)
|
239
|
+
@q.push("Tim", 18)
|
240
|
+
@q.push("Carol", 20)
|
241
|
+
|
242
|
+
5.times do
|
243
|
+
@q.pop do |e|
|
244
|
+
responses << e
|
245
|
+
EM.stop if responses.size == 5
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
responses[0].should == "Tim" # Tim
|
251
|
+
responses[1].should == "Mike" # Mike
|
252
|
+
responses[2].should == "Bob" # Bob
|
253
|
+
responses[3].should == "Carol" # Carol
|
254
|
+
responses[4].should == "Alex" # Alex
|
255
|
+
|
256
|
+
end
|
119
257
|
end
|
120
258
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: em-priority-queue
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-
|
12
|
+
date: 2011-12-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: eventmachine
|
16
|
-
requirement: &
|
16
|
+
requirement: &2152680760 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 1.0.0.beta.3
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2152680760
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: algorithms
|
27
|
-
requirement: &
|
27
|
+
requirement: &2152680260 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 0.3.0
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *2152680260
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rake
|
38
|
-
requirement: &
|
38
|
+
requirement: &2152679880 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *2152679880
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rspec
|
49
|
-
requirement: &
|
49
|
+
requirement: &2152679420 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,7 +54,18 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *2152679420
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: delorean
|
60
|
+
requirement: &2152678920 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: 1.1.1
|
66
|
+
type: :development
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *2152678920
|
58
69
|
description: Asynchronous Priority Queue with EventMachine
|
59
70
|
email:
|
60
71
|
- ft.mikelewis@gmail.com
|