hamster 1.0.1.pre.rc.1 → 1.0.1.pre.rc2

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.
Files changed (209) hide show
  1. checksums.yaml +4 -4
  2. data/lib/hamster/groupable.rb +12 -0
  3. data/lib/hamster/hash.rb +32 -12
  4. data/lib/hamster/list.rb +68 -22
  5. data/lib/hamster/queue.rb +5 -6
  6. data/lib/hamster/set.rb +50 -14
  7. data/lib/hamster/stack.rb +2 -0
  8. data/lib/hamster/trie.rb +34 -14
  9. data/lib/hamster/tuple.rb +9 -24
  10. data/lib/hamster/vector.rb +29 -7
  11. data/lib/hamster/version.rb +1 -1
  12. data/spec/hamster/core_ext/array_spec.rb +4 -10
  13. data/spec/hamster/core_ext/enumerable_spec.rb +1 -0
  14. data/spec/hamster/experimental/mutable_set/add_qm_spec.rb +14 -22
  15. data/spec/hamster/experimental/mutable_set/add_spec.rb +20 -34
  16. data/spec/hamster/experimental/mutable_set/delete_qm_spec.rb +15 -24
  17. data/spec/hamster/experimental/mutable_set/delete_spec.rb +15 -25
  18. data/spec/hamster/experimental/mutable_stack/pop_spec.rb +21 -27
  19. data/spec/hamster/experimental/mutable_stack/push_spec.rb +11 -31
  20. data/spec/hamster/hash/all_spec.rb +21 -34
  21. data/spec/hamster/hash/any_spec.rb +0 -15
  22. data/spec/hamster/hash/clear_spec.rb +1 -8
  23. data/spec/hamster/hash/construction_spec.rb +3 -11
  24. data/spec/hamster/hash/copying_spec.rb +1 -8
  25. data/spec/hamster/hash/delete_spec.rb +1 -10
  26. data/spec/hamster/hash/each_spec.rb +1 -12
  27. data/spec/hamster/hash/empty_spec.rb +8 -8
  28. data/spec/hamster/hash/eql_spec.rb +30 -22
  29. data/spec/hamster/hash/except_spec.rb +1 -10
  30. data/spec/hamster/hash/fetch_spec.rb +1 -24
  31. data/spec/hamster/hash/filter_spec.rb +1 -16
  32. data/spec/hamster/hash/find_spec.rb +1 -14
  33. data/spec/hamster/hash/has_key_spec.rb +1 -10
  34. data/spec/hamster/hash/hash_spec.rb +1 -16
  35. data/spec/hamster/hash/immutable_spec.rb +0 -3
  36. data/spec/hamster/hash/inspect_spec.rb +1 -9
  37. data/spec/hamster/hash/keys_spec.rb +4 -5
  38. data/spec/hamster/hash/map_spec.rb +1 -16
  39. data/spec/hamster/hash/merge_spec.rb +5 -11
  40. data/spec/hamster/hash/new_spec.rb +21 -0
  41. data/spec/hamster/hash/put_spec.rb +13 -11
  42. data/spec/hamster/hash/reduce_spec.rb +7 -15
  43. data/spec/hamster/hash/remove_spec.rb +1 -16
  44. data/spec/hamster/hash/uniq_spec.rb +1 -8
  45. data/spec/hamster/hash/values_spec.rb +1 -6
  46. data/spec/hamster/immutable/copying_spec.rb +1 -8
  47. data/spec/hamster/immutable/immutable_spec.rb +1 -14
  48. data/spec/hamster/immutable/memoize_spec.rb +0 -1
  49. data/spec/hamster/list/add_spec.rb +1 -6
  50. data/spec/hamster/list/all_spec.rb +1 -28
  51. data/spec/hamster/list/any_spec.rb +1 -20
  52. data/spec/hamster/list/append_spec.rb +1 -11
  53. data/spec/hamster/list/at_spec.rb +1 -13
  54. data/spec/hamster/list/break_spec.rb +1 -13
  55. data/spec/hamster/list/cadr_spec.rb +1 -9
  56. data/spec/hamster/list/chunk_spec.rb +1 -9
  57. data/spec/hamster/list/clear_spec.rb +1 -9
  58. data/spec/hamster/list/combinations_spec.rb +1 -11
  59. data/spec/hamster/list/compact_spec.rb +1 -9
  60. data/spec/hamster/list/cons_spec.rb +1 -10
  61. data/spec/hamster/list/construction_spec.rb +1 -30
  62. data/spec/hamster/list/copying_spec.rb +1 -9
  63. data/spec/hamster/list/count_spec.rb +1 -15
  64. data/spec/hamster/list/cycle_spec.rb +1 -10
  65. data/spec/hamster/list/drop_spec.rb +1 -9
  66. data/spec/hamster/list/drop_while_spec.rb +1 -13
  67. data/spec/hamster/list/each_slice_spec.rb +1 -17
  68. data/spec/hamster/list/each_spec.rb +1 -17
  69. data/spec/hamster/list/each_with_index_spec.rb +1 -10
  70. data/spec/hamster/list/elem_index_spec.rb +1 -13
  71. data/spec/hamster/list/elem_indices_spec.rb +1 -11
  72. data/spec/hamster/list/empty_spec.rb +1 -13
  73. data/spec/hamster/list/eql_spec.rb +52 -62
  74. data/spec/hamster/list/find_index_spec.rb +1 -13
  75. data/spec/hamster/list/find_indices_spec.rb +1 -11
  76. data/spec/hamster/list/find_spec.rb +1 -17
  77. data/spec/hamster/list/flatten_spec.rb +1 -9
  78. data/spec/hamster/list/grep_spec.rb +1 -16
  79. data/spec/hamster/list/group_by_spec.rb +1 -20
  80. data/spec/hamster/list/head_spec.rb +1 -11
  81. data/spec/hamster/list/include_spec.rb +1 -13
  82. data/spec/hamster/list/init_spec.rb +1 -8
  83. data/spec/hamster/list/inits_spec.rb +1 -9
  84. data/spec/hamster/list/inspect_spec.rb +1 -11
  85. data/spec/hamster/list/intersperse_spec.rb +1 -9
  86. data/spec/hamster/list/join_spec.rb +1 -18
  87. data/spec/hamster/list/last_spec.rb +1 -11
  88. data/spec/hamster/list/map_spec.rb +1 -15
  89. data/spec/hamster/list/maximum_spec.rb +1 -20
  90. data/spec/hamster/list/merge_by_spec.rb +1 -19
  91. data/spec/hamster/list/merge_spec.rb +1 -20
  92. data/spec/hamster/list/minimum_spec.rb +1 -20
  93. data/spec/hamster/list/none_spec.rb +1 -18
  94. data/spec/hamster/list/one_spec.rb +1 -16
  95. data/spec/hamster/list/partition_spec.rb +1 -13
  96. data/spec/hamster/list/product_spec.rb +1 -11
  97. data/spec/hamster/list/reduce_spec.rb +0 -1
  98. data/spec/hamster/list/remove_spec.rb +1 -15
  99. data/spec/hamster/list/reverse_spec.rb +1 -11
  100. data/spec/hamster/list/size_spec.rb +1 -13
  101. data/spec/hamster/list/slice_spec.rb +1 -11
  102. data/spec/hamster/list/sorting_spec.rb +1 -14
  103. data/spec/hamster/list/span_spec.rb +1 -12
  104. data/spec/hamster/list/split_at_spec.rb +1 -9
  105. data/spec/hamster/list/sum_spec.rb +1 -11
  106. data/spec/hamster/list/tail_spec.rb +1 -11
  107. data/spec/hamster/list/tails_spec.rb +1 -9
  108. data/spec/hamster/list/take_spec.rb +1 -9
  109. data/spec/hamster/list/take_while_spec.rb +0 -1
  110. data/spec/hamster/list/to_a_spec.rb +1 -13
  111. data/spec/hamster/list/to_ary_spec.rb +0 -1
  112. data/spec/hamster/list/to_list_spec.rb +1 -9
  113. data/spec/hamster/list/to_set_spec.rb +2 -8
  114. data/spec/hamster/list/union_spec.rb +1 -11
  115. data/spec/hamster/list/uniq_spec.rb +1 -11
  116. data/spec/hamster/queue/clear_spec.rb +1 -9
  117. data/spec/hamster/queue/construction_spec.rb +1 -10
  118. data/spec/hamster/queue/dequeue_spec.rb +1 -11
  119. data/spec/hamster/queue/empty_spec.rb +1 -13
  120. data/spec/hamster/queue/enqueue_spec.rb +1 -11
  121. data/spec/hamster/queue/head_spec.rb +1 -11
  122. data/spec/hamster/queue/inspect_spec.rb +1 -9
  123. data/spec/hamster/queue/size_spec.rb +1 -11
  124. data/spec/hamster/queue/to_a_spec.rb +1 -11
  125. data/spec/hamster/queue/to_list_spec.rb +1 -11
  126. data/spec/hamster/set/add_spec.rb +1 -12
  127. data/spec/hamster/set/all_spec.rb +1 -18
  128. data/spec/hamster/set/any_spec.rb +1 -17
  129. data/spec/hamster/set/clear_spec.rb +9 -8
  130. data/spec/hamster/set/compact_spec.rb +1 -9
  131. data/spec/hamster/set/construction_spec.rb +1 -9
  132. data/spec/hamster/set/copying_spec.rb +1 -8
  133. data/spec/hamster/set/count_spec.rb +1 -13
  134. data/spec/hamster/set/delete_spec.rb +1 -10
  135. data/spec/hamster/set/difference_spec.rb +1 -11
  136. data/spec/hamster/set/empty_spec.rb +1 -11
  137. data/spec/hamster/set/exclusion_spec.rb +1 -11
  138. data/spec/hamster/set/filter_spec.rb +10 -17
  139. data/spec/hamster/set/find_spec.rb +1 -14
  140. data/spec/hamster/set/flatten_spec.rb +8 -10
  141. data/spec/hamster/set/group_by_spec.rb +8 -17
  142. data/spec/hamster/set/head_spec.rb +1 -12
  143. data/spec/hamster/set/immutable_spec.rb +1 -4
  144. data/spec/hamster/set/include_spec.rb +1 -9
  145. data/spec/hamster/set/inspect_spec.rb +1 -9
  146. data/spec/hamster/set/intersection_spec.rb +1 -11
  147. data/spec/hamster/set/join_spec.rb +1 -16
  148. data/spec/hamster/set/map_spec.rb +1 -16
  149. data/spec/hamster/set/marshal_spec.rb +1 -6
  150. data/spec/hamster/set/maximum_spec.rb +1 -18
  151. data/spec/hamster/set/minimum_spec.rb +1 -17
  152. data/spec/hamster/set/new_spec.rb +21 -0
  153. data/spec/hamster/set/none_spec.rb +1 -16
  154. data/spec/hamster/set/one_spec.rb +1 -14
  155. data/spec/hamster/set/partition_spec.rb +1 -13
  156. data/spec/hamster/set/product_spec.rb +1 -9
  157. data/spec/hamster/set/reduce_spec.rb +1 -26
  158. data/spec/hamster/set/remove_spec.rb +1 -16
  159. data/spec/hamster/set/size_spec.rb +1 -9
  160. data/spec/hamster/set/sorting_spec.rb +1 -3
  161. data/spec/hamster/set/subset_spec.rb +1 -9
  162. data/spec/hamster/set/sum_spec.rb +1 -9
  163. data/spec/hamster/set/superset_spec.rb +1 -9
  164. data/spec/hamster/set/to_a_spec.rb +1 -11
  165. data/spec/hamster/set/to_list_spec.rb +1 -11
  166. data/spec/hamster/set/to_set_spec.rb +1 -9
  167. data/spec/hamster/set/union_spec.rb +1 -11
  168. data/spec/hamster/set/uniq_spec.rb +1 -7
  169. data/spec/hamster/sorter/immutable_spec.rb +1 -4
  170. data/spec/hamster/stack/clear_spec.rb +1 -9
  171. data/spec/hamster/stack/construction_spec.rb +1 -10
  172. data/spec/hamster/stack/copying_spec.rb +1 -9
  173. data/spec/hamster/stack/empty_spec.rb +1 -9
  174. data/spec/hamster/stack/eql_spec.rb +1 -13
  175. data/spec/hamster/stack/immutable_spec.rb +1 -4
  176. data/spec/hamster/stack/inspect_spec.rb +1 -9
  177. data/spec/hamster/stack/peek_spec.rb +1 -11
  178. data/spec/hamster/stack/pop_spec.rb +1 -11
  179. data/spec/hamster/stack/push_spec.rb +1 -11
  180. data/spec/hamster/stack/size_spec.rb +1 -11
  181. data/spec/hamster/stack/to_a_spec.rb +1 -11
  182. data/spec/hamster/stack/to_list_spec.rb +1 -9
  183. data/spec/hamster/tuple/construction_spec.rb +30 -0
  184. data/spec/hamster/tuple/copying_spec.rb +1 -8
  185. data/spec/hamster/tuple/eql_spec.rb +57 -40
  186. data/spec/hamster/tuple/first_spec.rb +1 -6
  187. data/spec/hamster/tuple/immutable_spec.rb +1 -4
  188. data/spec/hamster/tuple/inspect_spec.rb +1 -6
  189. data/spec/hamster/tuple/last_spec.rb +1 -6
  190. data/spec/hamster/tuple/to_a_spec.rb +1 -9
  191. data/spec/hamster/tuple/to_ary_spec.rb +0 -1
  192. data/spec/hamster/undefined/erase_spec.rb +1 -12
  193. data/spec/hamster/vector/add_spec.rb +8 -0
  194. data/spec/hamster/vector/clear_spec.rb +1 -8
  195. data/spec/hamster/vector/copying_spec.rb +1 -8
  196. data/spec/hamster/vector/each_spec.rb +1 -11
  197. data/spec/hamster/vector/each_with_index_spec.rb +1 -9
  198. data/spec/hamster/vector/empty_spec.rb +7 -9
  199. data/spec/hamster/vector/eql_spec.rb +1 -12
  200. data/spec/hamster/vector/filter_spec.rb +8 -12
  201. data/spec/hamster/vector/first_spec.rb +1 -11
  202. data/spec/hamster/vector/get_spec.rb +1 -23
  203. data/spec/hamster/vector/include_spec.rb +1 -10
  204. data/spec/hamster/vector/map_spec.rb +8 -14
  205. data/spec/hamster/vector/new_spec.rb +48 -0
  206. data/spec/hamster/vector/reduce_spec.rb +1 -26
  207. data/spec/hamster/vector/set_spec.rb +8 -0
  208. data/spec/spec_helper.rb +0 -5
  209. metadata +35 -68
@@ -37,6 +37,8 @@ module Hamster
37
37
  end
38
38
  def_delegator :self, :push, :<<
39
39
  def_delegator :self, :push, :enqueue
40
+ def_delegator :self, :push, :conj
41
+ def_delegator :self, :push, :conjoin
40
42
 
41
43
  def pop
42
44
  list = @list.tail
@@ -1,8 +1,10 @@
1
- require "forwardable"
2
-
3
1
  module Hamster
4
2
  class Trie
5
- extend Forwardable
3
+ def self.[](pairs)
4
+ result = self.new(0)
5
+ pairs.each { |key, val| result.send(:put!, key, val) }
6
+ result
7
+ end
6
8
 
7
9
  # Returns the number of key-value pairs in the trie.
8
10
  attr_reader :size
@@ -23,7 +25,6 @@ module Hamster
23
25
  def key?(key)
24
26
  !!get(key)
25
27
  end
26
- def_delegator :self, :key?, :has_key?
27
28
 
28
29
  # Calls <tt>block</tt> once for each entry in the trie, passing the key-value pair as parameters.
29
30
  def each
@@ -50,12 +51,14 @@ module Hamster
50
51
 
51
52
  if !entry
52
53
  entries = @entries.dup
54
+ key = key.dup.freeze if key.is_a?(String)
53
55
  entries[index] = Entry.new(key, value)
54
- self.class.new(@significant_bits, @size + 1, entries, @children)
56
+ Trie.new(@significant_bits, @size + 1, entries, @children)
55
57
  elsif entry.key.eql?(key)
56
58
  entries = @entries.dup
59
+ key = key.dup.freeze if key.is_a?(String)
57
60
  entries[index] = Entry.new(key, value)
58
- self.class.new(@significant_bits, @size, entries, @children)
61
+ Trie.new(@significant_bits, @size, entries, @children)
59
62
  else
60
63
  children = @children.dup
61
64
  child = children[index]
@@ -63,11 +66,11 @@ module Hamster
63
66
  if child
64
67
  children[index] = child.put(key, value)
65
68
  else
66
- children[index] = self.class.new(@significant_bits + 5).put!(key, value)
69
+ children[index] = Trie.new(@significant_bits + 5).put!(key, value)
67
70
  end
68
71
  new_child_size = children[index].size
69
72
  new_self_size = @size + (new_child_size - child_size)
70
- self.class.new(@significant_bits, new_self_size, @entries, children)
73
+ Trie.new(@significant_bits, new_self_size, @entries, children)
71
74
  end
72
75
  end
73
76
 
@@ -85,7 +88,7 @@ module Hamster
85
88
 
86
89
  # Returns a copy of <tt>self</tt> with the given key (and associated value) deleted. If not found, returns <tt>self</tt>.
87
90
  def delete(key)
88
- find_and_delete(key) || self.class.new(@significant_bits)
91
+ find_and_delete(key) || Trie.new(@significant_bits)
89
92
  end
90
93
 
91
94
  def include?(key, value)
@@ -102,15 +105,32 @@ module Hamster
102
105
  end
103
106
  true
104
107
  end
105
- def_delegator :self, :eql?, :==
108
+ alias :== :eql?
106
109
 
107
110
  protected
108
111
 
109
112
  # Returns <tt>self</tt> after overwriting the element associated with the specified key.
110
113
  def put!(key, value)
111
114
  index = index_for(key)
112
- @size += 1 unless @entries[index]
113
- @entries[index] = Entry.new(key, value)
115
+ entry = @entries[index]
116
+ if !entry
117
+ @size += 1
118
+ key = key.dup.freeze if key.is_a?(String)
119
+ @entries[index] = Entry.new(key, value)
120
+ elsif entry.key.eql?(key)
121
+ key = key.dup.freeze if key.is_a?(String)
122
+ @entries[index] = Entry.new(key, value)
123
+ else
124
+ child = @children[index]
125
+ if child
126
+ old_child_size = child.size
127
+ @children[index] = child.put!(key, value)
128
+ @size += child.size - old_child_size
129
+ else
130
+ @children[index] = Trie.new(@significant_bits + 5).put!(key, value)
131
+ @size += 1
132
+ end
133
+ end
114
134
  self
115
135
  end
116
136
 
@@ -130,7 +150,7 @@ module Hamster
130
150
  children = @children.dup
131
151
  children[index] = copy
132
152
  new_size = @size - (child.size - copy_size(copy))
133
- return self.class.new(@significant_bits, new_size, @entries, children)
153
+ return Trie.new(@significant_bits, new_size, @entries, children)
134
154
  end
135
155
  end
136
156
  end
@@ -151,7 +171,7 @@ module Hamster
151
171
  else
152
172
  entries[index] = nil
153
173
  end
154
- self.class.new(@significant_bits, @size - 1, entries, children || @children)
174
+ Trie.new(@significant_bits, @size - 1, entries, children || @children)
155
175
  end
156
176
  end
157
177
 
@@ -1,39 +1,24 @@
1
- require "forwardable"
2
1
  require "hamster/immutable"
3
2
 
4
3
  module Hamster
5
- class Tuple
6
- extend Forwardable
4
+ def self.tuple(*items)
5
+ Hamster::Tuple.new(*items)
6
+ end
7
+ class Tuple < Array
7
8
  include Immutable
8
9
 
9
10
  def initialize(*items)
10
- @items = items.freeze
11
- end
12
-
13
- def first
14
- @items.first
15
- end
16
-
17
- def last
18
- @items.last
11
+ super(items)
19
12
  end
20
13
 
21
14
  def eql?(other)
22
- return true if other.equal?(self)
23
- instance_of?(other.class) && @items.eql?(other.instance_variable_get(:@items))
24
- end
25
- def_delegator :self, :eql?, :==
26
-
27
- def to_ary
28
- @items
29
- end
30
-
31
- def to_a
32
- @items.dup
15
+ other.is_a?(Tuple) && super
33
16
  end
34
17
 
35
18
  def inspect
36
- "(#{@items.inspect[1..-2]})"
19
+ "(#{super[1..-2]})"
37
20
  end
21
+
22
+ undef :<<, :[]=, :collect!, :compact!, :delete, :delete_at, :delete_if, :flatten!, :map!, :reject!, :reverse!, :rotate!, :select!, :shuffle!, :slice!, :sort!, :sort_by!, :uniq!
38
23
  end
39
24
  end
@@ -5,7 +5,7 @@ require "hamster/enumerable"
5
5
 
6
6
  module Hamster
7
7
  def self.vector(*items)
8
- items.reduce(EmptyVector) { |vector, item| vector.add(item) }
8
+ Vector.new(items)
9
9
  end
10
10
 
11
11
  class Vector
@@ -20,10 +20,30 @@ module Hamster
20
20
  attr_reader :size
21
21
  def_delegator :self, :size, :length
22
22
 
23
- def initialize
23
+ class << self
24
+ alias :alloc :new
25
+
26
+ def new(items=[])
27
+ items.empty? ? empty : alloc(items)
28
+ end
29
+
30
+ def [](*items)
31
+ new(items)
32
+ end
33
+
34
+ def empty
35
+ @empty ||= self.alloc
36
+ end
37
+ end
38
+
39
+ def initialize(items=[])
40
+ @root = items
41
+ @size = items.size
24
42
  @levels = 0
25
- @root = []
26
- @size = 0
43
+ while @root.size > 32
44
+ @root = @root.each_slice(32).to_a
45
+ @levels += 1
46
+ end
27
47
  end
28
48
 
29
49
  def empty?
@@ -48,6 +68,8 @@ module Hamster
48
68
  end
49
69
  def_delegator :self, :add, :<<
50
70
  def_delegator :self, :add, :cons
71
+ def_delegator :self, :add, :conj
72
+ def_delegator :self, :add, :conjoin
51
73
 
52
74
  # def delete(index)
53
75
  # end
@@ -79,13 +101,13 @@ module Hamster
79
101
 
80
102
  def map(&block)
81
103
  return self unless block_given?
82
- reduce(EmptyVector) { |vector, item| vector.add(yield(item)) }
104
+ reduce(self.class.empty) { |vector, item| vector.add(yield(item)) }
83
105
  end
84
106
  def_delegator :self, :map, :collect
85
107
 
86
108
  def filter
87
109
  return self unless block_given?
88
- reduce(EmptyVector) { |vector, item| yield(item) ? vector.add(item) : vector }
110
+ reduce(self.class.empty) { |vector, item| yield(item) ? vector.add(item) : vector }
89
111
  end
90
112
 
91
113
  def clear
@@ -143,7 +165,7 @@ module Hamster
143
165
  end
144
166
 
145
167
  def full?
146
- (@size >> root_index_bits) > 0
168
+ (@size >> root_index_bits) > 31
147
169
  end
148
170
 
149
171
  def root_index_bits
@@ -1,3 +1,3 @@
1
1
  module Hamster
2
- VERSION = "1.0.1-rc.1"
2
+ VERSION = "1.0.1-rc2"
3
3
  end
@@ -1,20 +1,14 @@
1
1
  require "spec_helper"
2
-
3
2
  require "hamster/core_ext/enumerable"
4
3
 
5
4
  describe Array do
5
+ let(:array) { %w[A B C] }
6
6
 
7
7
  describe "#to_list" do
8
+ let(:to_list) { array.to_list }
8
9
 
9
- before do
10
- array = %w[A B C]
11
- @list = array.to_list
12
- end
13
-
14
- it "returns an equivalent list" do
15
- @list.should == Hamster.list("A", "B", "C")
10
+ it "should be an equivalent hamster list" do
11
+ expect(to_list).to eq(Hamster.list("A", "B", "C"))
16
12
  end
17
-
18
13
  end
19
-
20
14
  end
@@ -13,6 +13,7 @@ describe Enumerable do
13
13
  @values.each(&block)
14
14
  end
15
15
  end
16
+
16
17
  let(:enumerable) { TestEnumerable.new("A", "B", "C") }
17
18
 
18
19
  describe "#to_list" do
@@ -3,45 +3,37 @@ require "spec_helper"
3
3
  require "hamster/experimental/mutable_set"
4
4
 
5
5
  describe Hamster::MutableSet do
6
+ let(:mutable) { Hamster.mutable_set(*values) }
6
7
 
7
8
  describe "#add?" do
9
+ let(:values) { %w[A B C] }
10
+ let(:add?) { mutable.add?(value) }
8
11
 
9
- before do
10
- @set = Hamster.mutable_set("A", "B", "C")
11
- end
12
-
13
- describe "with a unique value" do
14
-
15
- before do
16
- @result = @set.add?("D")
17
- end
12
+ context "with a unique value" do
13
+ let(:value) { "D" }
18
14
 
19
15
  it "returns true" do
20
- @result.should == true
16
+ expect(add?).to be true
21
17
  end
22
18
 
23
19
  it "modifies the set to include the new value" do
24
- @set.should == Hamster.mutable_set("A", "B", "C", "D")
20
+ add?
21
+ expect(mutable).to eq(Hamster.mutable_set("A", "B", "C", "D"))
25
22
  end
26
23
 
27
24
  end
28
25
 
29
- describe "with a duplicate value" do
26
+ context "with a duplicate value" do
27
+ let(:value) { "C" }
30
28
 
31
- before do
32
- @result = @set.add?("C")
29
+ it "returns false" do
30
+ expect(add?).to be(false)
33
31
  end
34
32
 
35
33
  it "preserves the original values" do
36
- @set.should == Hamster.mutable_set("A", "B", "C")
34
+ add?
35
+ expect(mutable).to eq(Hamster.mutable_set("A", "B", "C"))
37
36
  end
38
-
39
- it "returns false" do
40
- @result.should == false
41
- end
42
-
43
37
  end
44
-
45
38
  end
46
-
47
39
  end
@@ -1,51 +1,37 @@
1
1
  require "spec_helper"
2
-
3
2
  require "hamster/experimental/mutable_set"
4
3
 
5
4
  describe Hamster::MutableSet do
5
+ let(:mutable) { Hamster.mutable_set(*values) }
6
6
 
7
- [:add, :<<].each do |method|
7
+ describe "#add" do
8
+ let(:values) { %w[A B C] }
9
+ let(:add) { mutable.add(value) }
8
10
 
9
- describe "##{method}" do
11
+ context "with a unique value" do
12
+ let(:value) { "D" }
10
13
 
11
- before do
12
- @set = Hamster.mutable_set("A", "B", "C")
14
+ it "returns self" do
15
+ expect(add).to eq(mutable)
13
16
  end
14
17
 
15
- describe "with a unique value" do
16
-
17
- before do
18
- @result = @set.send(method, "D")
19
- end
20
-
21
- it "returns self" do
22
- @result.should equal(@set)
23
- end
24
-
25
- it "modifies the set to include the new value" do
26
- @set.should == Hamster.mutable_set("A", "B", "C", "D")
27
- end
28
-
18
+ it "modifies the original set to include new value" do
19
+ add
20
+ expect(mutable).to eq(Hamster.mutable_set("A", "B", "C", "D"))
29
21
  end
22
+ end
30
23
 
31
- describe "with a duplicate value" do
32
-
33
- before do
34
- @result = @set.send(method, "C")
35
- end
36
-
37
- it "preserves the original values" do
38
- @set.should == Hamster.mutable_set("A", "B", "C")
39
- end
40
-
41
- it "returns self" do
42
- @result.should equal(@set)
43
- end
24
+ context "with a duplicate value" do
25
+ let(:value) { "C" }
44
26
 
27
+ it "returns self" do
28
+ expect(add).to eq(mutable)
45
29
  end
46
30
 
31
+ it "preserves the original values" do
32
+ add
33
+ expect(mutable).to eq(Hamster.mutable_set("A", "B", "C"))
34
+ end
47
35
  end
48
-
49
36
  end
50
-
51
37
  end
@@ -1,47 +1,38 @@
1
1
  require "spec_helper"
2
-
3
2
  require "hamster/experimental/mutable_set"
4
3
 
5
- describe Hamster::Set do
4
+ describe Hamster::MutableSet do
5
+ let(:mutable) { Hamster.mutable_set(*values) }
6
6
 
7
7
  describe "#delete?" do
8
+ let(:values) { %w[A B C] }
9
+ let(:delete?) { mutable.delete?(value) }
8
10
 
9
- before do
10
- @set = Hamster.mutable_set("A", "B", "C")
11
- end
12
-
13
- describe "with an existing value" do
14
11
 
15
- before do
16
- @result = @set.delete?("B")
17
- end
12
+ context "with an existing value" do
13
+ let(:value) { "B" }
18
14
 
19
15
  it "returns true" do
20
- @result.should == true
16
+ expect(delete?).to be(true)
21
17
  end
22
18
 
23
19
  it "modifies the set to remove the value" do
24
- @set.should == Hamster.mutable_set("A", "C")
20
+ delete?
21
+ expect(mutable).to eq(Hamster.mutable_set("A", "C"))
25
22
  end
26
-
27
23
  end
28
24
 
29
- describe "with a non-existing value" do
25
+ context "with a non-existing value" do
26
+ let(:value) { "D" }
30
27
 
31
- before do
32
- @result = @set.delete?("D")
28
+ it "returns false" do
29
+ expect(delete?).to be(false)
33
30
  end
34
31
 
35
32
  it "preserves the original values" do
36
- @set.should == Hamster.mutable_set("A", "B", "C")
33
+ delete?
34
+ expect(mutable).to eq(Hamster.mutable_set("A", "B", "C"))
37
35
  end
38
-
39
- it "returns false" do
40
- @result.should == false
41
- end
42
-
43
36
  end
44
-
45
37
  end
46
-
47
38
  end