ione 1.2.0.pre8 → 1.2.0.pre9
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.
- checksums.yaml +4 -4
- data/lib/ione/heap.rb +23 -20
- data/lib/ione/version.rb +1 -1
- data/spec/ione/heap_spec.rb +8 -21
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 269fc51bb786b26f473b2eec82fb37495832842e
|
4
|
+
data.tar.gz: 7c709b42991c6879f9a0cd1df579e31b158a0d32
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e984ed67e16f8dcbcd10671e3033f911b17af68eb5cb2e11231c01dd4dd83fdaff70681e928100226dafbd7fb027ebe64bc20d178a3e216945ce7bd7134a9a2
|
7
|
+
data.tar.gz: 37dc89c4553b85de563ea94caffc8d07f555e622c1ab3d00170be9dfb6c47ae0d7c754ce6eac09a586eaff3040ad065db6a05e61eca35201737f6ab397a0b96c
|
data/lib/ione/heap.rb
CHANGED
@@ -5,6 +5,7 @@ module Ione
|
|
5
5
|
class Heap
|
6
6
|
def initialize
|
7
7
|
@items = []
|
8
|
+
@indexes = {}
|
8
9
|
end
|
9
10
|
|
10
11
|
def size
|
@@ -16,8 +17,11 @@ module Ione
|
|
16
17
|
end
|
17
18
|
|
18
19
|
def push(item)
|
19
|
-
@
|
20
|
-
|
20
|
+
unless @indexes.include?(item)
|
21
|
+
@items << item
|
22
|
+
@indexes[item] = @items.size - 1
|
23
|
+
bubble_up(@items.size - 1)
|
24
|
+
end
|
21
25
|
end
|
22
26
|
alias_method :<<, :push
|
23
27
|
|
@@ -29,10 +33,14 @@ module Ione
|
|
29
33
|
if @items.size == 0
|
30
34
|
nil
|
31
35
|
elsif @items.size == 1
|
32
|
-
@items.pop
|
36
|
+
item = @items.pop
|
37
|
+
@indexes.delete(item)
|
38
|
+
item
|
33
39
|
else
|
34
40
|
item = @items.first
|
41
|
+
@indexes.delete(item)
|
35
42
|
@items[0] = @items.pop
|
43
|
+
@indexes[@items[0]] = 0
|
36
44
|
bubble_down(0)
|
37
45
|
item
|
38
46
|
end
|
@@ -42,10 +50,14 @@ module Ione
|
|
42
50
|
if item == @items.first
|
43
51
|
pop
|
44
52
|
elsif item == @items.last
|
45
|
-
@items.pop
|
46
|
-
|
53
|
+
item = @items.pop
|
54
|
+
@indexes.delete(item)
|
55
|
+
item
|
56
|
+
elsif (i = @indexes[item])
|
47
57
|
item = @items[i]
|
58
|
+
@indexes.delete(item)
|
48
59
|
@items[i] = @items.pop
|
60
|
+
@indexes[@items[i]] = i
|
49
61
|
bubble_up(bubble_down(i))
|
50
62
|
item
|
51
63
|
end
|
@@ -53,25 +65,14 @@ module Ione
|
|
53
65
|
|
54
66
|
private
|
55
67
|
|
56
|
-
def index(item, root_index=0)
|
57
|
-
left_index = (root_index * 2) + 1
|
58
|
-
right_index = (root_index * 2) + 2
|
59
|
-
root_item = @items[root_index]
|
60
|
-
if root_item == item
|
61
|
-
root_index
|
62
|
-
elsif left_index < @items.length && item >= @items[left_index] && (i = index(item, left_index))
|
63
|
-
i
|
64
|
-
elsif right_index < @items.length && item >= @items[right_index] && (i = index(item, right_index))
|
65
|
-
i
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
68
|
def bubble_up(index)
|
70
69
|
parent_index = (index - 1)/2
|
71
70
|
if parent_index >= 0 && @items[parent_index] > @items[index]
|
72
71
|
item = @items[index]
|
73
72
|
@items[index] = @items[parent_index]
|
74
73
|
@items[parent_index] = item
|
74
|
+
@indexes[@items[index]] = index
|
75
|
+
@indexes[@items[parent_index]] = parent_index
|
75
76
|
bubble_up(parent_index)
|
76
77
|
else
|
77
78
|
index
|
@@ -80,16 +81,18 @@ module Ione
|
|
80
81
|
|
81
82
|
def bubble_down(index)
|
82
83
|
child_index = (index * 2) + 1
|
83
|
-
if child_index >= @items.
|
84
|
+
if child_index >= @items.size
|
84
85
|
index
|
85
86
|
else
|
86
|
-
if child_index + 1 < @items.
|
87
|
+
if child_index + 1 < @items.size && @items[child_index] > @items[child_index + 1]
|
87
88
|
child_index += 1
|
88
89
|
end
|
89
90
|
if @items[index] > @items[child_index]
|
90
91
|
item = @items[index]
|
91
92
|
@items[index] = @items[child_index]
|
92
93
|
@items[child_index] = item
|
94
|
+
@indexes[@items[index]] = index
|
95
|
+
@indexes[@items[child_index]] = child_index
|
93
96
|
bubble_down(child_index)
|
94
97
|
else
|
95
98
|
index
|
data/lib/ione/version.rb
CHANGED
data/spec/ione/heap_spec.rb
CHANGED
@@ -43,13 +43,20 @@ module Ione
|
|
43
43
|
heap.size.should == 4
|
44
44
|
end
|
45
45
|
|
46
|
-
it 'is
|
46
|
+
it 'is aliased as #<<' do
|
47
47
|
heap << 4
|
48
48
|
heap << 3
|
49
49
|
heap << 6
|
50
50
|
heap << 5
|
51
51
|
heap.size.should == 4
|
52
52
|
end
|
53
|
+
|
54
|
+
it 'does not add duplicates' do
|
55
|
+
heap << 3
|
56
|
+
heap << 3
|
57
|
+
heap << 3
|
58
|
+
heap.size.should == 1
|
59
|
+
end
|
53
60
|
end
|
54
61
|
|
55
62
|
describe '#peek' do
|
@@ -102,17 +109,6 @@ module Ione
|
|
102
109
|
heap.pop.should == 3
|
103
110
|
heap.pop.should be_nil
|
104
111
|
end
|
105
|
-
|
106
|
-
it 'returns each duplicate' do
|
107
|
-
heap.push(3)
|
108
|
-
heap.push(4)
|
109
|
-
heap.push(3)
|
110
|
-
heap.push(3)
|
111
|
-
heap.pop.should == 3
|
112
|
-
heap.pop.should == 3
|
113
|
-
heap.pop.should == 3
|
114
|
-
heap.pop.should == 4
|
115
|
-
end
|
116
112
|
end
|
117
113
|
|
118
114
|
describe '#delete' do
|
@@ -168,15 +164,6 @@ module Ione
|
|
168
164
|
heap.push(5)
|
169
165
|
heap.delete(6).should be_nil
|
170
166
|
end
|
171
|
-
|
172
|
-
it 'removes the first instance of the item from the heap' do
|
173
|
-
heap.push(3)
|
174
|
-
heap.push(3)
|
175
|
-
heap.push(5)
|
176
|
-
heap.delete(3).should == 3
|
177
|
-
heap.delete(3).should == 3
|
178
|
-
heap.size.should == 1
|
179
|
-
end
|
180
167
|
end
|
181
168
|
end
|
182
169
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ione
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.0.
|
4
|
+
version: 1.2.0.pre9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Theo Hultberg
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-10-
|
11
|
+
date: 2014-10-28 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Reactive programming framework for Ruby, painless evented IO, futures
|
14
14
|
and an efficient byte buffer
|