em-priority-queue 0.0.1
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/.gitignore +3 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +32 -0
- data/README +1 -0
- data/Rakefile +9 -0
- data/em-priority-queue.gemspec +28 -0
- data/lib/em-priority-queue.rb +4 -0
- data/lib/em-priority-queue/priority_queue.rb +55 -0
- data/lib/em-priority-queue/version.rb +5 -0
- data/spec/em-priority-queue_spec.rb +94 -0
- data/spec/spec_helper.rb +2 -0
- metadata +140 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
em-priority-queue (0.0.1)
|
5
|
+
algorithms (~> 0.3.0)
|
6
|
+
eventmachine (>= 1.0.0.beta.3)
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: http://rubygems.org/
|
10
|
+
specs:
|
11
|
+
algorithms (0.3.0)
|
12
|
+
diff-lcs (1.1.2)
|
13
|
+
eventmachine (1.0.0.beta.3)
|
14
|
+
rake (0.9.2)
|
15
|
+
rspec (2.6.0)
|
16
|
+
rspec-core (~> 2.6.0)
|
17
|
+
rspec-expectations (~> 2.6.0)
|
18
|
+
rspec-mocks (~> 2.6.0)
|
19
|
+
rspec-core (2.6.4)
|
20
|
+
rspec-expectations (2.6.0)
|
21
|
+
diff-lcs (~> 1.1.2)
|
22
|
+
rspec-mocks (2.6.0)
|
23
|
+
|
24
|
+
PLATFORMS
|
25
|
+
ruby
|
26
|
+
|
27
|
+
DEPENDENCIES
|
28
|
+
algorithms (~> 0.3.0)
|
29
|
+
em-priority-queue!
|
30
|
+
eventmachine (>= 1.0.0.beta.3)
|
31
|
+
rake
|
32
|
+
rspec
|
data/README
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
EM Priority Queue
|
data/Rakefile
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "em-priority-queue/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "em-priority-queue"
|
7
|
+
s.version = EventMachine::PriorityQueue::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Mike Lewis"]
|
10
|
+
s.email = ["ft.mikelewis@gmail.com"]
|
11
|
+
s.homepage = ""
|
12
|
+
s.summary = %q{Async Priority Queue}
|
13
|
+
s.description = %q{Aync Priority Queue}
|
14
|
+
|
15
|
+
s.rubyforge_project = "em-priority-queue"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
s.add_dependency "eventmachine", ">= 1.0.0.beta.3"
|
23
|
+
s.add_dependency "algorithms", "~> 0.3.0"
|
24
|
+
|
25
|
+
|
26
|
+
s.add_development_dependency 'rake'
|
27
|
+
s.add_development_dependency 'rspec'
|
28
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module EventMachine
|
2
|
+
class PriorityQueue
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
def initialize(&blk)
|
6
|
+
block ||= lambda { |x, y| (x <=> y) == 1 }
|
7
|
+
@heap = Containers::Heap.new(&block)
|
8
|
+
@callbacks = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def size
|
12
|
+
@heap.size
|
13
|
+
end
|
14
|
+
|
15
|
+
def push(obj, pri)
|
16
|
+
EM.schedule do
|
17
|
+
@heap.push(pri, obj)
|
18
|
+
@callbacks.shift.call(@heap.pop) until @heap.empty? || @callbacks.empty?
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def clear
|
23
|
+
@heap.clear
|
24
|
+
end
|
25
|
+
|
26
|
+
def empty?
|
27
|
+
@heap.empty?
|
28
|
+
end
|
29
|
+
|
30
|
+
def has_priority?(priority)
|
31
|
+
@heap.has_key?(priority)
|
32
|
+
end
|
33
|
+
|
34
|
+
def next
|
35
|
+
@heap.next
|
36
|
+
end
|
37
|
+
|
38
|
+
def pop(*a, &c)
|
39
|
+
cb = EM::Callback(*a, &c)
|
40
|
+
EM.schedule do
|
41
|
+
if @heap.empty?
|
42
|
+
@callbacks << cb
|
43
|
+
else
|
44
|
+
cb.call @heap.pop
|
45
|
+
end
|
46
|
+
end
|
47
|
+
nil
|
48
|
+
end
|
49
|
+
|
50
|
+
def delete(pri)
|
51
|
+
@heap.delete(pri)
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe EventMachine::PriorityQueue do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@q = EM::PriorityQueue.new
|
7
|
+
end
|
8
|
+
|
9
|
+
context "Reg. Queue" do
|
10
|
+
it "should return 0 for size and be empty" do
|
11
|
+
@q.size.should == 0
|
12
|
+
@q.empty?.should == true
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should should push things onto the queue" do
|
16
|
+
EM.run do
|
17
|
+
5.times do |i|
|
18
|
+
@q.push(i, 1)
|
19
|
+
end
|
20
|
+
EM.stop
|
21
|
+
end
|
22
|
+
|
23
|
+
@q.size.should == 5
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should pop elements after adding them" do
|
27
|
+
responses = []
|
28
|
+
EM.run do
|
29
|
+
5.times do |i|
|
30
|
+
@q.push(i, 1)
|
31
|
+
end
|
32
|
+
|
33
|
+
5.times do
|
34
|
+
@q.pop do |e|
|
35
|
+
responses << e
|
36
|
+
EM.stop if @q.empty?
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
responses.length.should == 5
|
42
|
+
[0,1,2,3,4].each do |n|
|
43
|
+
responses.should include(n)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should pop elements if there are callbacks waiting for pushes" do
|
48
|
+
responses = []
|
49
|
+
EM.run do
|
50
|
+
3.times do
|
51
|
+
@q.pop do |e|
|
52
|
+
responses << e
|
53
|
+
EM.stop if responses.size == 3
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
5.times do |n|
|
58
|
+
@q.push(n, 1)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
responses.length.should == 3
|
62
|
+
[0,1,2].each do |n|
|
63
|
+
responses.should include(n)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context "Priority Queue" do
|
69
|
+
it "should give elements in the order of their priority" do
|
70
|
+
responses = []
|
71
|
+
EM.run do
|
72
|
+
|
73
|
+
|
74
|
+
@q.push("Mike", 20)
|
75
|
+
@q.push("Alex", 21)
|
76
|
+
@q.push("Bob", 22)
|
77
|
+
@q.push("Tim", 18)
|
78
|
+
|
79
|
+
4.times do
|
80
|
+
@q.pop do |e|
|
81
|
+
responses << e
|
82
|
+
EM.stop if responses.size == 4
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
responses[0].should == "Bob"
|
88
|
+
responses[1].should == "Alex"
|
89
|
+
responses[2].should == "Mike"
|
90
|
+
responses[3].should == "Tim"
|
91
|
+
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,140 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: em-priority-queue
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Mike Lewis
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-07-16 00:00:00 -07:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: eventmachine
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 62196357
|
30
|
+
segments:
|
31
|
+
- 1
|
32
|
+
- 0
|
33
|
+
- 0
|
34
|
+
- beta
|
35
|
+
- 3
|
36
|
+
version: 1.0.0.beta.3
|
37
|
+
type: :runtime
|
38
|
+
version_requirements: *id001
|
39
|
+
- !ruby/object:Gem::Dependency
|
40
|
+
name: algorithms
|
41
|
+
prerelease: false
|
42
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
hash: 19
|
48
|
+
segments:
|
49
|
+
- 0
|
50
|
+
- 3
|
51
|
+
- 0
|
52
|
+
version: 0.3.0
|
53
|
+
type: :runtime
|
54
|
+
version_requirements: *id002
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
prerelease: false
|
58
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
hash: 3
|
64
|
+
segments:
|
65
|
+
- 0
|
66
|
+
version: "0"
|
67
|
+
type: :development
|
68
|
+
version_requirements: *id003
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
prerelease: false
|
72
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
hash: 3
|
78
|
+
segments:
|
79
|
+
- 0
|
80
|
+
version: "0"
|
81
|
+
type: :development
|
82
|
+
version_requirements: *id004
|
83
|
+
description: Aync Priority Queue
|
84
|
+
email:
|
85
|
+
- ft.mikelewis@gmail.com
|
86
|
+
executables: []
|
87
|
+
|
88
|
+
extensions: []
|
89
|
+
|
90
|
+
extra_rdoc_files: []
|
91
|
+
|
92
|
+
files:
|
93
|
+
- .gitignore
|
94
|
+
- Gemfile
|
95
|
+
- Gemfile.lock
|
96
|
+
- README
|
97
|
+
- Rakefile
|
98
|
+
- em-priority-queue.gemspec
|
99
|
+
- lib/em-priority-queue.rb
|
100
|
+
- lib/em-priority-queue/priority_queue.rb
|
101
|
+
- lib/em-priority-queue/version.rb
|
102
|
+
- spec/em-priority-queue_spec.rb
|
103
|
+
- spec/spec_helper.rb
|
104
|
+
has_rdoc: true
|
105
|
+
homepage: ""
|
106
|
+
licenses: []
|
107
|
+
|
108
|
+
post_install_message:
|
109
|
+
rdoc_options: []
|
110
|
+
|
111
|
+
require_paths:
|
112
|
+
- lib
|
113
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
hash: 3
|
119
|
+
segments:
|
120
|
+
- 0
|
121
|
+
version: "0"
|
122
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
|
+
none: false
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
hash: 3
|
128
|
+
segments:
|
129
|
+
- 0
|
130
|
+
version: "0"
|
131
|
+
requirements: []
|
132
|
+
|
133
|
+
rubyforge_project: em-priority-queue
|
134
|
+
rubygems_version: 1.3.7
|
135
|
+
signing_key:
|
136
|
+
specification_version: 3
|
137
|
+
summary: Async Priority Queue
|
138
|
+
test_files:
|
139
|
+
- spec/em-priority-queue_spec.rb
|
140
|
+
- spec/spec_helper.rb
|