hamster 0.4.2 → 0.4.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,12 @@
1
+ === 0.4.3 / 2012-10-01
2
+
3
+ * Track size on Tries for performance (fredericksgary)
4
+ * Hash#values should not return a set as there is no guarantee of uniqueness (and worse it means you potentially lose duplicate values). (fredericksgary)
5
+ * Add Hash#slice, Hash#except, Hash#fetch (misfo)
6
+ * Implemented a public Hash#new for subclassing (misfo)
7
+ * Some initial benchmarks (haedius)
8
+ * Documentation corrections (harukizaemon, szajbus, rwfowler)
9
+
1
10
  === 0.4.2 / 2011-04-07
2
11
 
3
12
  * Added List#merge/merge_by to merge sorted lists into a single stream.
@@ -8,7 +17,9 @@
8
17
 
9
18
  * Added initial implementation of Vector for efficient indexed access.
10
19
 
11
- * Fix car/cdr so they work on Ruby 1.8.7 (Tianyi Cui)
20
+ * Fix car/cdr so they work on Ruby 1.8.7 (tianyicui)
21
+ * Fix specs when running under 1.8.7 (tianyicui, kef)
22
+ * Fix bundler/rvm support (kef)
12
23
 
13
24
  === 0.3.10 / 2010-10-22
14
25
 
@@ -3,11 +3,11 @@
3
3
  GitHub: http://github.com/harukizaemon/hamster
4
4
  RubyGems: https://rubygems.org/gems/hamster
5
5
  email: haruki_zaemon@mac.com
6
- IRC: #haruki_zaemon on freenode
6
+ IRC: ##haruki_zaemon on freenode
7
7
 
8
8
  == Introduction
9
9
 
10
- Hamster started out as an implementation of Hash Array Mapped Tries (HAMT) for Ruby (see http://lamp.epfl.ch/papers/idealhashtrees.pdf) and has since expanded to include implementations of other Persistent Data Structures (see http://en.wikipedia.org/wiki/Persistent_data_structure) including Set, List, Stack, Queue, and Vector.
10
+ Hamster started out as an implementation of Hash Array Mapped Tries (HAMT) for Ruby (see http://lampwww.epfl.ch/papers/idealhashtrees.pdf) and has since expanded to include implementations of other Persistent Data Structures (see http://en.wikipedia.org/wiki/Persistent_data_structure) including Set, List, Stack, Queue, and Vector.
11
11
 
12
12
  Hamster collections are immutable. Whenever you modify a Hamster collection, the original is preserved and a modified copy is returned. This makes them inherently thread-safe and sharable. (For an interesting perspective on why immutability itself is inherently a good thing, you might like to take a look at Matthias Felleisen's Function Objects presentation: http://www.ccs.neu.edu/home/matthias/Presentations/ecoop2004.pdf)
13
13
 
@@ -29,6 +29,11 @@ Once installed, all that remains is to make the collection classes available in
29
29
 
30
30
  require 'hamster'
31
31
 
32
+ Installation via bundler is even easier:
33
+
34
+ gem "hamster"
35
+
36
+
32
37
  If you prefer, you can instead require individual classes as necessary:
33
38
 
34
39
  require 'hamster/list'
@@ -220,7 +225,7 @@ versus
220
225
 
221
226
  (1..10000).each { |i| hash[i] } # => 0.001s
222
227
 
223
- What's even better -- or worse depending on your perspective -- is that after all that, the native Hash version still isn't thread-safe and still requires some synchronisation around it slowing it down even further and.
228
+ What's even better -- or worse depending on your perspective -- is that after all that, the native Hash version still isn't thread-safe and still requires some synchronisation around it slowing it down even further.
224
229
 
225
230
  The Hamster version on the other hand was unchanged from the original whilst remaining inherently thread-safe, and 3 orders of magnitude faster.
226
231
 
@@ -7,7 +7,7 @@ require 'hamster/trie'
7
7
  module Hamster
8
8
 
9
9
  def self.hash(pairs = {}, &block)
10
- pairs.reduce(block_given? ? Hash.new(&block) : EmptyHash) { |hash, pair| hash.put(pair.first, pair.last) }
10
+ Hash.new(pairs, &block)
11
11
  end
12
12
 
13
13
  class Hash
@@ -16,6 +16,15 @@ module Hamster
16
16
 
17
17
  include Immutable
18
18
 
19
+ class << self
20
+ def new(pairs = {}, &block)
21
+ @empty ||= super()
22
+ pairs.reduce(block_given? ? super(&block) : @empty) { |hash, pair| hash.put(pair.first, pair.last) }
23
+ end
24
+
25
+ attr_reader :empty
26
+ end
27
+
19
28
  def initialize(&block)
20
29
  @trie = EmptyTrie
21
30
  @default = block
@@ -48,6 +57,19 @@ module Hamster
48
57
  end
49
58
  def_delegator :self, :get, :[]
50
59
 
60
+ def fetch(key, default = Undefined)
61
+ entry = @trie.get(key)
62
+ if entry
63
+ entry.value
64
+ elsif default != Undefined
65
+ default
66
+ elsif block_given?
67
+ yield
68
+ else
69
+ raise KeyError.new("key not found: #{key.inspect}")
70
+ end
71
+ end
72
+
51
73
  def put(key, value = Undefined)
52
74
  return put(key, yield(get(key))) if value.equal?(Undefined)
53
75
  transform { @trie = @trie.put(key, value) }
@@ -82,7 +104,7 @@ module Hamster
82
104
  def filter
83
105
  return self unless block_given?
84
106
  trie = @trie.filter { |entry| yield(entry.key, entry.value) }
85
- return EmptyHash if trie.empty?
107
+ return self.class.empty if trie.empty?
86
108
  transform_unless(trie.equal?(@trie)) { @trie = trie }
87
109
  end
88
110
  def_delegator :self, :filter, :select
@@ -127,16 +149,24 @@ module Hamster
127
149
  end
128
150
  def_delegator :self, :merge, :+
129
151
 
152
+ def except(*keys)
153
+ keys.reduce(self) { |hash, key| hash.delete(key) }
154
+ end
155
+
156
+ def slice(*keys)
157
+ except(*self.keys - keys)
158
+ end
159
+
130
160
  def keys
131
161
  reduce(Hamster.set) { |keys, key, value| keys.add(key) }
132
162
  end
133
163
 
134
164
  def values
135
- reduce(Hamster.set) { |values, key, value| values.add(value) }
165
+ reduce(Hamster.list) { |values, key, value| values.cons(value) }
136
166
  end
137
167
 
138
168
  def clear
139
- EmptyHash
169
+ self.class.empty
140
170
  end
141
171
 
142
172
  def eql?(other)
@@ -6,15 +6,16 @@ module Hamster
6
6
 
7
7
  extend Forwardable
8
8
 
9
- def initialize(significant_bits, entries = [], children = [])
9
+ def initialize(significant_bits, size = 0, entries = [], children = [])
10
10
  @significant_bits = significant_bits
11
11
  @entries = entries
12
12
  @children = children
13
+ @size = size
13
14
  end
14
15
 
15
16
  # Returns the number of key-value pairs in the trie.
16
17
  def size
17
- reduce(0) { |memo, item| memo.next }
18
+ @size
18
19
  end
19
20
 
20
21
  # Returns <tt>true</tt> if the trie contains no key-value pairs.
@@ -49,19 +50,27 @@ module Hamster
49
50
  def put(key, value)
50
51
  index = index_for(key)
51
52
  entry = @entries[index]
52
- if !entry || entry.key.eql?(key)
53
+
54
+ if !entry
55
+ entries = @entries.dup
56
+ entries[index] = Entry.new(key, value)
57
+ self.class.new(@significant_bits, @size + 1, entries, @children)
58
+ elsif entry.key.eql?(key)
53
59
  entries = @entries.dup
54
60
  entries[index] = Entry.new(key, value)
55
- self.class.new(@significant_bits, entries, @children)
61
+ self.class.new(@significant_bits, @size, entries, @children)
56
62
  else
57
63
  children = @children.dup
58
64
  child = children[index]
65
+ child_size = child ? child.size : 0
59
66
  children[index] = if child
60
67
  child.put(key, value)
61
68
  else
62
69
  self.class.new(@significant_bits + 5).put!(key, value)
63
70
  end
64
- self.class.new(@significant_bits, @entries, children)
71
+ new_child_size = children[index].size
72
+ new_self_size = @size + (new_child_size - child_size)
73
+ self.class.new(@significant_bits, new_self_size, @entries, children)
65
74
  end
66
75
  end
67
76
 
@@ -104,7 +113,9 @@ module Hamster
104
113
 
105
114
  # Returns <tt>self</tt> after overwriting the element associated with the specified key.
106
115
  def put!(key, value)
107
- @entries[index_for(key)] = Entry.new(key, value)
116
+ index = index_for(key)
117
+ @size += 1 unless @entries[index]
118
+ @entries[index] = Entry.new(key, value)
108
119
  self
109
120
  end
110
121
 
@@ -123,7 +134,9 @@ module Hamster
123
134
  if !copy.equal?(child)
124
135
  children = @children.dup
125
136
  children[index] = copy
126
- return self.class.new(@significant_bits, @entries, children)
137
+ copy_size = copy ? copy.size : 0
138
+ new_size = @size - (child.size - copy_size)
139
+ return self.class.new(@significant_bits, new_size, @entries, children)
127
140
  end
128
141
  end
129
142
  end
@@ -144,7 +157,7 @@ module Hamster
144
157
  else
145
158
  entries[index] = nil
146
159
  end
147
- self.class.new(@significant_bits, entries, children || @children)
160
+ self.class.new(@significant_bits, @size - 1, entries, children || @children)
148
161
  end
149
162
  end
150
163
 
@@ -1,5 +1,5 @@
1
1
  module Hamster
2
2
 
3
- VERSION = "0.4.2".freeze
3
+ VERSION = "0.4.3".freeze
4
4
 
5
5
  end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ require 'hamster/hash'
4
+
5
+ describe Hamster::Hash do
6
+
7
+ describe "#except" do
8
+
9
+ before do
10
+ @hash = Hamster.hash("A" => "aye", "B" => "bee", "C" => "see", nil => "NIL")
11
+ end
12
+
13
+ describe "with only keys that the Hash has" do
14
+
15
+ it "returns a Hash without those values" do
16
+ @hash.except("B", nil).should == Hamster.hash("A" => "aye", "C" => "see")
17
+ end
18
+
19
+ end
20
+
21
+ describe "with keys that the Hash doesn't have" do
22
+
23
+ it "returns a Hash without the values that it had keys for" do
24
+ @hash.except("B", "A", 3).should == Hamster.hash("C" => "see", nil => "NIL")
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+
31
+ end
@@ -0,0 +1,95 @@
1
+ require 'spec_helper'
2
+
3
+ require 'hamster/hash'
4
+
5
+ describe Hamster::Hash do
6
+
7
+ describe "#fetch" do
8
+
9
+ describe "with no default provided" do
10
+
11
+ describe "when the key exists" do
12
+
13
+ before do
14
+ @hash = Hamster.hash("A" => "aye")
15
+ end
16
+
17
+ it "returns the value associated with the key" do
18
+ @hash.fetch("A").should == "aye"
19
+ end
20
+
21
+ end
22
+
23
+ describe "when the key does not exist" do
24
+
25
+ before do
26
+ @hash = Hamster.hash("A" => "aye")
27
+ end
28
+
29
+ it "raises a KeyError" do
30
+ lambda { @hash.fetch("B") }.should raise_error(KeyError)
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+
37
+ describe "with a default value" do
38
+
39
+ describe "when the key exists" do
40
+
41
+ before do
42
+ @hash = Hamster.hash("A" => "aye")
43
+ end
44
+
45
+ it "returns the value associated with the key" do
46
+ @hash.fetch("A", "default").should == "aye"
47
+ end
48
+
49
+ end
50
+
51
+ describe "when the key does not exist" do
52
+
53
+ before do
54
+ @hash = Hamster.hash("A" => "aye")
55
+ end
56
+
57
+ it "returns the default value" do
58
+ @hash.fetch("B", "default").should == "default"
59
+ end
60
+
61
+ end
62
+
63
+ end
64
+
65
+ describe "with a default block" do
66
+
67
+ describe "when the key exists" do
68
+
69
+ before do
70
+ @hash = Hamster.hash("A" => "aye")
71
+ end
72
+
73
+ it "returns the value associated with the key" do
74
+ @hash.fetch("A") { "default".upcase }.should == "aye"
75
+ end
76
+
77
+ end
78
+
79
+ describe "when the key does not exist" do
80
+
81
+ before do
82
+ @hash = Hamster.hash("A" => "aye")
83
+ end
84
+
85
+ it "returns the default value" do
86
+ @hash.fetch("B") { "default".upcase }.should == "DEFAULT"
87
+ end
88
+
89
+ end
90
+
91
+ end
92
+
93
+ end
94
+
95
+ end
@@ -6,7 +6,7 @@ describe Hamster::Hash do
6
6
 
7
7
  [:has_key?, :key?, :include?, :member?].each do |method|
8
8
 
9
- describe "#has_key?" do
9
+ describe "##{method}" do
10
10
 
11
11
  before do
12
12
  @hash = Hamster.hash("A" => "aye", "B" => "bee", "C" => "see", nil => "NIL", 2.0 => "two")
@@ -34,6 +34,21 @@ describe Hamster::Hash do
34
34
 
35
35
  end
36
36
 
37
+ describe "from a subclass" do
38
+ before do
39
+ @subclass = Class.new(Hamster::Hash)
40
+ @instance = @subclass.new("some" => "values")
41
+ end
42
+
43
+ it "should return an instance of the subclass" do
44
+ @instance.class.should be @subclass
45
+ end
46
+
47
+ it "should return a frozen instance" do
48
+ @instance.frozen?.should be true
49
+ end
50
+ end
51
+
37
52
  end
38
53
 
39
54
  end
@@ -20,6 +20,40 @@ describe Hamster::Hash do
20
20
 
21
21
  end
22
22
 
23
+ lots = (1..10842).to_a
24
+ srand 89533474
25
+ random_things = (lots + lots).sort_by{|x|rand}
26
+
27
+ it "should have the correct size after adding lots of things with colliding keys and such" do
28
+ h = Hamster.hash
29
+ random_things.each do |thing|
30
+ h = h.put(thing, thing * 2)
31
+ end
32
+ h.size.should == 10842
33
+ end
34
+
35
+ random_actions = (lots.map{|x|[:add, x]} + lots.map{|x|[:add, x]} + lots.map{|x|[:remove, x]}).
36
+ sort_by{|x|rand}
37
+ ending_size = random_actions.reduce({}) do |h, (act, ob)|
38
+ if act == :add
39
+ h[ob] = 1
40
+ else
41
+ h.delete(ob)
42
+ end
43
+ h
44
+ end.size
45
+ it "should have the correct size after lots of addings and removings" do
46
+ h = Hamster.hash
47
+ random_actions.each do |(act, ob)|
48
+ if act == :add
49
+ h = h.put(ob, ob * 3)
50
+ else
51
+ h = h.delete(ob)
52
+ end
53
+ end
54
+ h.size.should == ending_size
55
+ end
56
+
23
57
  end
24
58
 
25
59
  end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ require 'hamster/hash'
4
+
5
+ describe Hamster::Hash do
6
+
7
+ describe "#slice" do
8
+
9
+ before do
10
+ @hash = Hamster.hash("A" => "aye", "B" => "bee", "C" => "see", nil => "NIL")
11
+ end
12
+
13
+ describe "with only keys that the Hash has" do
14
+
15
+ it "returns a Hash with only those values" do
16
+ @hash.slice("B", nil).should == Hamster.hash("B" => "bee", nil => "NIL")
17
+ end
18
+
19
+ end
20
+
21
+ describe "with keys that the Hash doesn't have" do
22
+
23
+ it "returns a Hash with only the values that have matching keys" do
24
+ @hash.slice("B", "A", 3).should == Hamster.hash("A" => "aye", "B" => "bee")
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+
31
+ end
@@ -12,10 +12,23 @@ describe Hamster::Hash do
12
12
  @result = hash.values
13
13
  end
14
14
 
15
- it "returns the keys as a set" do
16
- @result.should == Hamster.set("aye", "bee", "see")
15
+ it "returns the keys as a list" do
16
+ @result.should be_a Hamster::List
17
+ @result.to_a.sort.should == %w(aye bee see)
17
18
  end
18
19
 
19
20
  end
20
21
 
22
+ describe "#values with duplicates" do
23
+ before do
24
+ hash = Hamster.hash(:A => 15, :B => 19, :C => 15)
25
+ @result = hash.values
26
+ end
27
+
28
+ it "returns the keys as a list" do
29
+ @result.should be_a Hamster::List
30
+ @result.to_a.sort.should == [15,15,19]
31
+ end
32
+ end
33
+
21
34
  end
@@ -21,7 +21,7 @@
21
21
  <img src="./assets/0.4.4/loading.gif" alt="loading"/>
22
22
  </div>
23
23
  <div id="wrapper" style="display:none;">
24
- <div class="timestamp">Generated <abbr class="timeago" title="2011-04-07T13:03:54+10:00">2011-04-07T13:03:54+10:00</abbr></div>
24
+ <div class="timestamp">Generated <abbr class="timeago" title="2011-04-11T06:35:16+10:00">2011-04-11T06:35:16+10:00</abbr></div>
25
25
  <ul class="group_tabs"></ul>
26
26
 
27
27
  <div id="content">
@@ -60,7 +60,7 @@
60
60
  <div id="footer">
61
61
  Generated by <a href="http://github.com/colszowka/simplecov">simplecov</a> v0.4.2
62
62
  and simplecov-html v0.4.4<br/>
63
- using /tmp/textmate-command-58941.rb , /tmp/textmate-command-59015.rb , /tmp/textmate-command-59035.rb , /tmp/textmate-command-59071.rb , /tmp/textmate-command-59137.rb , /tmp/textmate-command-59162.rb , /tmp/textmate-command-59218.rb
63
+ using /tmp/textmate-command-54823.rb , /tmp/textmate-command-54890.rb
64
64
  </div>
65
65
 
66
66
  <div class="source_files">
@@ -1,151 +1,225 @@
1
- ---
2
- ! '/tmp/textmate-command-50488.rb ':
1
+ ---
2
+ "/tmp/textmate-command-50488.rb ":
3
3
  :original_result: {}
4
- :created_at: 2011-04-07 07:19:13.013366000 +10:00
5
- ! '/tmp/textmate-command-50541.rb ':
4
+
5
+ :created_at: 2011-04-07 07:19:26.366000 +10:00
6
+ "/tmp/textmate-command-50541.rb ":
6
7
  :original_result: {}
7
- :created_at: 2011-04-07 07:19:30.903733000 +10:00
8
- ! '/tmp/textmate-command-50803.rb ':
8
+
9
+ :created_at: 2011-04-07 07:34:33.733000 +10:00
10
+ "/tmp/textmate-command-50803.rb ":
9
11
  :original_result: {}
10
- :created_at: 2011-04-07 07:29:41.242780000 +10:00
11
- ! '/tmp/textmate-command-52586.rb ':
12
+
13
+ :created_at: 2011-04-07 07:33:43.780000 +10:00
14
+ "/tmp/textmate-command-52586.rb ":
12
15
  :original_result: {}
13
- :created_at: 2011-04-07 09:06:15.934550000 +10:00
14
- ! '/tmp/textmate-command-52618.rb ':
16
+
17
+ :created_at: 2011-04-07 09:21:49.550000 +10:00
18
+ "/tmp/textmate-command-52618.rb ":
15
19
  :original_result: {}
16
- :created_at: 2011-04-07 09:06:35.170856000 +10:00
17
- ! '/tmp/textmate-command-52647.rb ':
20
+
21
+ :created_at: 2011-04-07 09:09:25.856000 +10:00
22
+ "/tmp/textmate-command-52647.rb ":
18
23
  :original_result: {}
19
- :created_at: 2011-04-07 09:06:48.232595000 +10:00
20
- ! '/tmp/textmate-command-53439.rb ':
24
+
25
+ :created_at: 2011-04-07 09:10:40.595000 +10:00
26
+ "/tmp/textmate-command-53439.rb ":
21
27
  :original_result: {}
22
- :created_at: 2011-04-07 09:21:32.195457000 +10:00
23
- ! '/tmp/textmate-command-53471.rb ':
28
+
29
+ :created_at: 2011-04-07 09:24:47.457000 +10:00
30
+ "/tmp/textmate-command-53471.rb ":
24
31
  :original_result: {}
25
- :created_at: 2011-04-07 09:21:51.097155000 +10:00
26
- ! '/tmp/textmate-command-53542.rb ':
32
+
33
+ :created_at: 2011-04-07 09:23:28.155000 +10:00
34
+ "/tmp/textmate-command-53542.rb ":
27
35
  :original_result: {}
28
- :created_at: 2011-04-07 09:23:30.131648000 +10:00
29
- ! '/tmp/textmate-command-53717.rb ':
36
+
37
+ :created_at: 2011-04-07 09:25:41.648000 +10:00
38
+ "/tmp/textmate-command-53717.rb ":
30
39
  :original_result: {}
31
- :created_at: 2011-04-07 09:27:13.926470000 +10:00
32
- ! '/tmp/textmate-command-53749.rb ':
40
+
41
+ :created_at: 2011-04-07 09:42:39.470000 +10:00
42
+ "/tmp/textmate-command-53749.rb ":
33
43
  :original_result: {}
34
- :created_at: 2011-04-07 09:27:39.606005000 +10:00
35
- ! '/tmp/textmate-command-53792.rb ':
44
+
45
+ :created_at: 2011-04-07 09:37:45.005000 +10:00
46
+ "/tmp/textmate-command-53792.rb ":
36
47
  :original_result: {}
37
- :created_at: 2011-04-07 09:28:04.488708000 +10:00
38
- ! '/tmp/textmate-command-53808.rb ':
48
+
49
+ :created_at: 2011-04-07 09:36:12.708000 +10:00
50
+ "/tmp/textmate-command-53808.rb ":
39
51
  :original_result: {}
40
- :created_at: 2011-04-07 09:28:08.739899000 +10:00
41
- ! '/tmp/textmate-command-53879.rb ':
52
+
53
+ :created_at: 2011-04-07 09:40:27.899000 +10:00
54
+ "/tmp/textmate-command-53879.rb ":
42
55
  :original_result: {}
43
- :created_at: 2011-04-07 09:28:59.680329000 +10:00
44
- ! '/tmp/textmate-command-53922.rb ':
56
+
57
+ :created_at: 2011-04-07 09:40:19.329000 +10:00
58
+ "/tmp/textmate-command-53922.rb ":
45
59
  :original_result: {}
46
- :created_at: 2011-04-07 09:29:24.661642000 +10:00
47
- ! '/tmp/textmate-command-53945.rb ':
60
+
61
+ :created_at: 2011-04-07 09:40:25.642000 +10:00
62
+ "/tmp/textmate-command-53945.rb ":
48
63
  :original_result: {}
49
- :created_at: 2011-04-07 09:29:47.920593000 +10:00
50
- ! '/tmp/textmate-command-53973.rb ':
64
+
65
+ :created_at: 2011-04-07 09:45:07.593000 +10:00
66
+ "/tmp/textmate-command-53973.rb ":
51
67
  :original_result: {}
52
- :created_at: 2011-04-07 09:29:57.067745000 +10:00
53
- ! '/tmp/textmate-command-54115.rb ':
68
+
69
+ :created_at: 2011-04-07 09:31:04.745000 +10:00
70
+ "/tmp/textmate-command-54115.rb ":
54
71
  :original_result: {}
55
- :created_at: 2011-04-07 09:33:04.487360000 +10:00
56
- ! '/tmp/textmate-command-54165.rb ':
72
+
73
+ :created_at: 2011-04-07 09:41:11.360000 +10:00
74
+ "/tmp/textmate-command-54165.rb ":
57
75
  :original_result: {}
58
- :created_at: 2011-04-07 09:33:42.057531000 +10:00
59
- ! '/tmp/textmate-command-54196.rb ':
76
+
77
+ :created_at: 2011-04-07 09:34:39.531000 +10:00
78
+ "/tmp/textmate-command-54196.rb ":
60
79
  :original_result: {}
61
- :created_at: 2011-04-07 09:34:03.577667000 +10:00
62
- ! '/tmp/textmate-command-54230.rb ':
80
+
81
+ :created_at: 2011-04-07 09:43:40.667000 +10:00
82
+ "/tmp/textmate-command-54230.rb ":
63
83
  :original_result: {}
64
- :created_at: 2011-04-07 09:34:26.159387000 +10:00
65
- ! '/tmp/textmate-command-54246.rb ':
84
+
85
+ :created_at: 2011-04-07 09:37:05.387000 +10:00
86
+ "/tmp/textmate-command-54246.rb ":
66
87
  :original_result: {}
67
- :created_at: 2011-04-07 09:34:28.411794000 +10:00
68
- ! '/tmp/textmate-command-54347.rb ':
88
+
89
+ :created_at: 2011-04-07 09:41:19.794000 +10:00
90
+ "/tmp/textmate-command-54347.rb ":
69
91
  :original_result: {}
70
- :created_at: 2011-04-07 09:36:48.940383000 +10:00
71
- ! '/tmp/textmate-command-54376.rb ':
92
+
93
+ :created_at: 2011-04-07 09:52:28.383000 +10:00
94
+ "/tmp/textmate-command-54376.rb ":
72
95
  :original_result: {}
73
- :created_at: 2011-04-07 09:37:02.939048000 +10:00
74
- ! '/tmp/textmate-command-54411.rb ':
96
+
97
+ :created_at: 2011-04-07 09:52:41.048000 +10:00
98
+ "/tmp/textmate-command-54411.rb ":
75
99
  :original_result: {}
76
- :created_at: 2011-04-07 09:37:32.403547000 +10:00
77
- ! '/tmp/textmate-command-54504.rb ':
100
+
101
+ :created_at: 2011-04-07 09:44:15.547000 +10:00
102
+ "/tmp/textmate-command-54504.rb ":
78
103
  :original_result: {}
79
- :created_at: 2011-04-07 09:56:53.808027000 +10:00
80
- ! '/tmp/textmate-command-54532.rb ':
104
+
105
+ :created_at: 2011-04-07 10:10:21.027000 +10:00
106
+ "/tmp/textmate-command-54532.rb ":
81
107
  :original_result: {}
82
- :created_at: 2011-04-07 09:57:03.978371000 +10:00
83
- ! '/tmp/textmate-command-54610.rb ':
108
+
109
+ :created_at: 2011-04-07 10:13:21.371000 +10:00
110
+ "/tmp/textmate-command-54610.rb ":
84
111
  :original_result: {}
85
- :created_at: 2011-04-07 09:58:16.189539000 +10:00
86
- ! '/tmp/textmate-command-54705.rb ':
112
+
113
+ :created_at: 2011-04-07 10:01:25.539000 +10:00
114
+ "/tmp/textmate-command-54705.rb ":
87
115
  :original_result: {}
88
- :created_at: 2011-04-07 10:00:30.064077000 +10:00
89
- ! '/tmp/textmate-command-54728.rb ':
116
+
117
+ :created_at: 2011-04-07 10:01:34.077000 +10:00
118
+ "/tmp/textmate-command-54728.rb ":
90
119
  :original_result: {}
91
- :created_at: 2011-04-07 10:00:51.109598000 +10:00
92
- ! '/tmp/textmate-command-54759.rb ':
120
+
121
+ :created_at: 2011-04-07 10:02:40.598000 +10:00
122
+ "/tmp/textmate-command-54759.rb ":
93
123
  :original_result: {}
94
- :created_at: 2011-04-07 10:01:12.217009000 +10:00
95
- ! '/tmp/textmate-command-54808.rb ':
124
+
125
+ :created_at: 2011-04-07 10:04:49.009000 +10:00
126
+ "/tmp/textmate-command-54808.rb ":
96
127
  :original_result: {}
97
- :created_at: 2011-04-07 10:19:33.467890000 +10:00
98
- ! '/tmp/textmate-command-58245.rb ':
128
+
129
+ :created_at: 2011-04-07 10:27:20.890000 +10:00
130
+ "/tmp/textmate-command-58245.rb ":
99
131
  :original_result: {}
100
- :created_at: 2011-04-07 12:47:57.747367000 +10:00
101
- ! '/tmp/textmate-command-58287.rb ':
132
+
133
+ :created_at: 2011-04-07 13:00:24.367000 +10:00
134
+ "/tmp/textmate-command-58287.rb ":
102
135
  :original_result: {}
103
- :created_at: 2011-04-07 12:48:08.536458000 +10:00
104
- ! '/tmp/textmate-command-58321.rb ':
136
+
137
+ :created_at: 2011-04-07 12:57:04.458000 +10:00
138
+ "/tmp/textmate-command-58321.rb ":
105
139
  :original_result: {}
106
- :created_at: 2011-04-07 12:48:32.624161000 +10:00
107
- ! '/tmp/textmate-command-58391.rb ':
140
+
141
+ :created_at: 2011-04-07 12:58:56.161000 +10:00
142
+ "/tmp/textmate-command-58391.rb ":
108
143
  :original_result: {}
109
- :created_at: 2011-04-07 12:49:49.139339000 +10:00
110
- ! '/tmp/textmate-command-58525.rb ':
144
+
145
+ :created_at: 2011-04-07 12:52:08.339000 +10:00
146
+ "/tmp/textmate-command-58525.rb ":
111
147
  :original_result: {}
112
- :created_at: 2011-04-07 12:51:30.235003000 +10:00
113
- ! '/tmp/textmate-command-58558.rb ':
148
+
149
+ :created_at: 2011-04-07 12:55:25.003000 +10:00
150
+ "/tmp/textmate-command-58558.rb ":
114
151
  :original_result: {}
115
- :created_at: 2011-04-07 12:51:50.758992000 +10:00
116
- ! '/tmp/textmate-command-58602.rb ':
152
+
153
+ :created_at: 2011-04-07 13:04:28.992000 +10:00
154
+ "/tmp/textmate-command-58602.rb ":
117
155
  :original_result: {}
118
- :created_at: 2011-04-07 12:52:05.989168000 +10:00
119
- ! '/tmp/textmate-command-58648.rb ':
156
+
157
+ :created_at: 2011-04-07 13:08:34.168000 +10:00
158
+ "/tmp/textmate-command-58648.rb ":
120
159
  :original_result: {}
121
- :created_at: 2011-04-07 12:53:04.676528000 +10:00
122
- ! '/tmp/textmate-command-58693.rb ':
160
+
161
+ :created_at: 2011-04-07 13:04:20.528000 +10:00
162
+ "/tmp/textmate-command-58693.rb ":
123
163
  :original_result: {}
124
- :created_at: 2011-04-07 12:53:24.296478000 +10:00
125
- ! '/tmp/textmate-command-58736.rb ':
164
+
165
+ :created_at: 2011-04-07 12:58:20.478000 +10:00
166
+ "/tmp/textmate-command-58736.rb ":
126
167
  :original_result: {}
127
- :created_at: 2011-04-07 12:53:40.526377000 +10:00
128
- ! '/tmp/textmate-command-58765.rb ':
168
+
169
+ :created_at: 2011-04-07 13:02:26.377000 +10:00
170
+ "/tmp/textmate-command-58765.rb ":
129
171
  :original_result: {}
130
- :created_at: 2011-04-07 12:53:44.093849000 +10:00
131
- ! '/tmp/textmate-command-58941.rb ':
172
+
173
+ :created_at: 2011-04-07 12:55:17.849000 +10:00
174
+ "/tmp/textmate-command-58941.rb ":
132
175
  :original_result: {}
133
- :created_at: 2011-04-07 12:59:23.506694000 +10:00
134
- ! '/tmp/textmate-command-59015.rb ':
176
+
177
+ :created_at: 2011-04-07 13:07:49.694000 +10:00
178
+ "/tmp/textmate-command-59015.rb ":
135
179
  :original_result: {}
136
- :created_at: 2011-04-07 13:00:41.350501000 +10:00
137
- ! '/tmp/textmate-command-59035.rb ':
180
+
181
+ :created_at: 2011-04-07 13:06:31.501000 +10:00
182
+ "/tmp/textmate-command-59035.rb ":
138
183
  :original_result: {}
139
- :created_at: 2011-04-07 13:00:50.161368000 +10:00
140
- ! '/tmp/textmate-command-59071.rb ':
184
+
185
+ :created_at: 2011-04-07 13:03:31.368000 +10:00
186
+ "/tmp/textmate-command-59071.rb ":
141
187
  :original_result: {}
142
- :created_at: 2011-04-07 13:01:19.459560000 +10:00
143
- ! '/tmp/textmate-command-59137.rb ':
188
+
189
+ :created_at: 2011-04-07 13:08:58.560000 +10:00
190
+ "/tmp/textmate-command-59137.rb ":
144
191
  :original_result: {}
145
- :created_at: 2011-04-07 13:01:54.437584000 +10:00
146
- ! '/tmp/textmate-command-59162.rb ':
192
+
193
+ :created_at: 2011-04-07 13:09:11.584000 +10:00
194
+ "/tmp/textmate-command-59162.rb ":
147
195
  :original_result: {}
148
- :created_at: 2011-04-07 13:02:22.386527000 +10:00
149
- ! '/tmp/textmate-command-59218.rb ':
196
+
197
+ :created_at: 2011-04-07 13:08:48.527000 +10:00
198
+ "/tmp/textmate-command-59218.rb ":
150
199
  :original_result: {}
151
- :created_at: 2011-04-07 13:03:54.755488000 +10:00
200
+
201
+ :created_at: 2011-04-07 13:16:29.488000 +10:00
202
+ "/tmp/textmate-command-22299.rb ":
203
+ :original_result: {}
204
+
205
+ :created_at: 2011-04-08 23:44:29.387143 +10:00
206
+ "/tmp/textmate-command-22367.rb ":
207
+ :original_result: {}
208
+
209
+ :created_at: 2011-04-08 23:45:02.840619 +10:00
210
+ "/tmp/textmate-command-22438.rb ":
211
+ :original_result: {}
212
+
213
+ :created_at: 2011-04-08 23:45:30.650235 +10:00
214
+ "/tmp/textmate-command-22544.rb ":
215
+ :original_result: {}
216
+
217
+ :created_at: 2011-04-08 23:47:11.009880 +10:00
218
+ "/tmp/textmate-command-54823.rb ":
219
+ :original_result: {}
220
+
221
+ :created_at: 2011-04-11 06:34:55.765170 +10:00
222
+ "/tmp/textmate-command-54890.rb ":
223
+ :original_result: {}
224
+
225
+ :created_at: 2011-04-11 06:35:16.806386 +10:00
metadata CHANGED
@@ -1,50 +1,57 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: hamster
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.3
4
5
  prerelease:
5
- version: 0.4.2
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Simon Harris
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-04-08 00:00:00 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
12
+ date: 2012-10-01 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
16
15
  name: rspec
17
- prerelease: false
18
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
19
17
  none: false
20
- requirements:
18
+ requirements:
21
19
  - - ~>
22
- - !ruby/object:Gem::Version
23
- version: "2"
20
+ - !ruby/object:Gem::Version
21
+ version: '2'
24
22
  type: :development
25
- version_requirements: *id001
26
- - !ruby/object:Gem::Dependency
27
- name: simplecov
28
23
  prerelease: false
29
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '2'
30
+ - !ruby/object:Gem::Dependency
31
+ name: simplecov
32
+ requirement: !ruby/object:Gem::Requirement
30
33
  none: false
31
- requirements:
34
+ requirements:
32
35
  - - ~>
33
- - !ruby/object:Gem::Version
34
- version: "0.3"
36
+ - !ruby/object:Gem::Version
37
+ version: '0.3'
35
38
  type: :development
36
- version_requirements: *id002
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '0.3'
37
46
  description: Efficient, Immutable, Thread-Safe Collection classes for Ruby
38
47
  email: haruki_zaemon@mac.com
39
48
  executables: []
40
-
41
49
  extensions: []
42
-
43
- extra_rdoc_files:
50
+ extra_rdoc_files:
44
51
  - README.rdoc
45
52
  - History.rdoc
46
53
  - LICENSE
47
- files:
54
+ files:
48
55
  - lib/hamster/core_ext/enumerable.rb
49
56
  - lib/hamster/core_ext/enumerator.rb
50
57
  - lib/hamster/core_ext/io.rb
@@ -136,6 +143,8 @@ files:
136
143
  - spec/hamster/hash/each_spec.rb
137
144
  - spec/hamster/hash/empty_spec.rb
138
145
  - spec/hamster/hash/eql_spec.rb
146
+ - spec/hamster/hash/except_spec.rb
147
+ - spec/hamster/hash/fetch_spec.rb
139
148
  - spec/hamster/hash/filter_spec.rb
140
149
  - spec/hamster/hash/find_spec.rb
141
150
  - spec/hamster/hash/get_spec.rb
@@ -151,6 +160,7 @@ files:
151
160
  - spec/hamster/hash/reduce_spec.rb
152
161
  - spec/hamster/hash/remove_spec.rb
153
162
  - spec/hamster/hash/size_spec.rb
163
+ - spec/hamster/hash/slice_spec.rb
154
164
  - spec/hamster/hash/uniq_spec.rb
155
165
  - spec/hamster/hash/values_spec.rb
156
166
  - spec/hamster/immutable/copying_spec.rb
@@ -483,30 +493,26 @@ files:
483
493
  - LICENSE
484
494
  homepage: http://github.com/harukizaemon/hamster
485
495
  licenses: []
486
-
487
496
  post_install_message:
488
497
  rdoc_options: []
489
-
490
- require_paths:
498
+ require_paths:
491
499
  - lib
492
- required_ruby_version: !ruby/object:Gem::Requirement
500
+ required_ruby_version: !ruby/object:Gem::Requirement
493
501
  none: false
494
- requirements:
495
- - - ">="
496
- - !ruby/object:Gem::Version
502
+ requirements:
503
+ - - ! '>='
504
+ - !ruby/object:Gem::Version
497
505
  version: 1.8.7
498
- required_rubygems_version: !ruby/object:Gem::Requirement
506
+ required_rubygems_version: !ruby/object:Gem::Requirement
499
507
  none: false
500
- requirements:
501
- - - ">="
502
- - !ruby/object:Gem::Version
503
- version: "0"
508
+ requirements:
509
+ - - ! '>='
510
+ - !ruby/object:Gem::Version
511
+ version: '0'
504
512
  requirements: []
505
-
506
513
  rubyforge_project:
507
- rubygems_version: 1.7.2
514
+ rubygems_version: 1.8.23
508
515
  signing_key:
509
516
  specification_version: 3
510
517
  summary: Efficient, Immutable, Thread-Safe Collection classes for Ruby
511
518
  test_files: []
512
-