hamster 0.3.10 → 0.4.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.
Files changed (73) hide show
  1. data/History.rdoc +10 -0
  2. data/README.rdoc +13 -10
  3. data/lib/hamster.rb +2 -1
  4. data/lib/hamster.rbc +165 -0
  5. data/lib/hamster/core_ext.rbc +69 -0
  6. data/lib/hamster/core_ext/enumerable.rbc +636 -0
  7. data/lib/hamster/core_ext/io.rbc +616 -0
  8. data/lib/hamster/enumerable.rb +141 -0
  9. data/lib/hamster/experimental/mutable_hash.rb +34 -0
  10. data/lib/hamster/experimental/mutable_queue.rb +34 -0
  11. data/lib/hamster/experimental/mutable_set.rb +46 -0
  12. data/lib/hamster/experimental/mutable_stack.rb +35 -0
  13. data/lib/hamster/{read_copy_update.rb → experimental/read_copy_update.rb} +4 -5
  14. data/lib/hamster/hash.rb +1 -0
  15. data/lib/hamster/hash.rbc +4429 -0
  16. data/lib/hamster/immutable.rbc +1609 -0
  17. data/lib/hamster/list.rb +4 -109
  18. data/lib/hamster/list.rbc +15710 -0
  19. data/lib/hamster/queue.rbc +1842 -0
  20. data/lib/hamster/set.rb +6 -111
  21. data/lib/hamster/set.rbc +7780 -0
  22. data/lib/hamster/sorter.rb +2 -2
  23. data/lib/hamster/sorter.rbc +371 -0
  24. data/lib/hamster/stack.rbc +1627 -0
  25. data/lib/hamster/trie.rbc +3527 -0
  26. data/lib/hamster/tuple.rbc +873 -0
  27. data/lib/hamster/undefined.rbc +258 -0
  28. data/lib/hamster/vector.rb +157 -0
  29. data/lib/hamster/version.rb +1 -1
  30. data/lib/hamster/version.rbc +136 -0
  31. data/spec/hamster/core_ext/io_spec.rb +2 -2
  32. data/spec/hamster/experimental/mutable_set/add?_spec.rb +47 -0
  33. data/spec/hamster/experimental/mutable_set/add_spec.rb +51 -0
  34. data/spec/hamster/experimental/mutable_set/delete?_spec.rb +47 -0
  35. data/spec/hamster/experimental/mutable_set/delete_spec.rb +47 -0
  36. data/spec/hamster/experimental/mutable_stack/pop_spec.rb +41 -0
  37. data/spec/hamster/experimental/mutable_stack/push_spec.rb +41 -0
  38. data/spec/hamster/hash/put_spec.rb +2 -2
  39. data/spec/hamster/list/each_with_index_spec.rb +42 -0
  40. data/spec/hamster/list/head_spec.rb +0 -12
  41. data/spec/hamster/set/construction_spec.rb +16 -4
  42. data/spec/hamster/set/filter_spec.rb +16 -0
  43. data/spec/hamster/set/flatten_spec.rb +13 -2
  44. data/spec/hamster/stack/pop_spec.rb +2 -24
  45. data/spec/hamster/vector/add_spec.rb +41 -0
  46. data/spec/hamster/vector/any_spec.rb +67 -0
  47. data/spec/hamster/vector/clear_spec.rb +36 -0
  48. data/spec/hamster/vector/copying_spec.rb +32 -0
  49. data/spec/hamster/vector/each_spec.rb +46 -0
  50. data/spec/hamster/vector/each_with_index_spec.rb +42 -0
  51. data/spec/hamster/vector/empty_spec.rb +35 -0
  52. data/spec/hamster/vector/eql_spec.rb +65 -0
  53. data/spec/hamster/vector/filter_spec.rb +63 -0
  54. data/spec/hamster/vector/first_spec.rb +35 -0
  55. data/spec/hamster/vector/get_spec.rb +81 -0
  56. data/spec/hamster/vector/include_spec.rb +45 -0
  57. data/spec/hamster/vector/inspect_spec.rb +31 -0
  58. data/spec/hamster/vector/last_spec.rb +32 -0
  59. data/spec/hamster/vector/reduce_spec.rb +87 -0
  60. data/spec/hamster/vector/set_spec.rb +153 -0
  61. data/spec/hamster/vector/size_spec.rb +27 -0
  62. data/spec/hamster/vector/to_a_spec.rb +42 -0
  63. data/spec/hamster/vector/to_ary_spec.rb +44 -0
  64. data/spec/spec_helper.rb +2 -2
  65. data/tasks/bundler.rb +2 -0
  66. data/tasks/publish.rb +1 -1
  67. data/tasks/rspec.rb +1 -2
  68. metadata +56 -14
  69. data/lib/hamster/read_copy_update_hash.rb +0 -28
  70. data/lib/hamster/read_copy_update_list.rb +0 -26
  71. data/lib/hamster/read_copy_update_queue.rb +0 -27
  72. data/lib/hamster/read_copy_update_set.rb +0 -26
  73. data/lib/hamster/read_copy_update_stack.rb +0 -27
@@ -0,0 +1,258 @@
1
+ !RBIX
2
+ 0
3
+ x
4
+ M
5
+ 1
6
+ n
7
+ n
8
+ x
9
+ 10
10
+ __script__
11
+ i
12
+ 28
13
+ 99
14
+ 7
15
+ 0
16
+ 65
17
+ 49
18
+ 1
19
+ 2
20
+ 13
21
+ 99
22
+ 12
23
+ 7
24
+ 2
25
+ 12
26
+ 7
27
+ 3
28
+ 12
29
+ 65
30
+ 12
31
+ 49
32
+ 4
33
+ 4
34
+ 15
35
+ 49
36
+ 2
37
+ 0
38
+ 15
39
+ 2
40
+ 11
41
+ I
42
+ 6
43
+ I
44
+ 0
45
+ I
46
+ 0
47
+ I
48
+ 0
49
+ n
50
+ p
51
+ 5
52
+ x
53
+ 7
54
+ Hamster
55
+ x
56
+ 11
57
+ open_module
58
+ x
59
+ 15
60
+ __module_init__
61
+ M
62
+ 1
63
+ n
64
+ n
65
+ x
66
+ 7
67
+ Hamster
68
+ i
69
+ 28
70
+ 5
71
+ 66
72
+ 99
73
+ 7
74
+ 0
75
+ 65
76
+ 49
77
+ 1
78
+ 2
79
+ 13
80
+ 99
81
+ 12
82
+ 7
83
+ 2
84
+ 12
85
+ 7
86
+ 3
87
+ 12
88
+ 65
89
+ 12
90
+ 49
91
+ 4
92
+ 4
93
+ 15
94
+ 49
95
+ 2
96
+ 0
97
+ 11
98
+ I
99
+ 6
100
+ I
101
+ 0
102
+ I
103
+ 0
104
+ I
105
+ 0
106
+ n
107
+ p
108
+ 5
109
+ x
110
+ 9
111
+ Undefined
112
+ x
113
+ 11
114
+ open_module
115
+ x
116
+ 15
117
+ __module_init__
118
+ M
119
+ 1
120
+ n
121
+ n
122
+ x
123
+ 9
124
+ Undefined
125
+ i
126
+ 13
127
+ 5
128
+ 66
129
+ 99
130
+ 7
131
+ 0
132
+ 7
133
+ 1
134
+ 65
135
+ 5
136
+ 49
137
+ 2
138
+ 4
139
+ 11
140
+ I
141
+ 5
142
+ I
143
+ 0
144
+ I
145
+ 0
146
+ I
147
+ 0
148
+ n
149
+ p
150
+ 3
151
+ x
152
+ 5
153
+ erase
154
+ M
155
+ 1
156
+ n
157
+ n
158
+ x
159
+ 5
160
+ erase
161
+ i
162
+ 14
163
+ 20
164
+ 0
165
+ 5
166
+ 49
167
+ 0
168
+ 1
169
+ 9
170
+ 11
171
+ 1
172
+ 8
173
+ 13
174
+ 20
175
+ 0
176
+ 11
177
+ I
178
+ 3
179
+ I
180
+ 1
181
+ I
182
+ 1
183
+ I
184
+ 1
185
+ n
186
+ p
187
+ 1
188
+ x
189
+ 6
190
+ equal?
191
+ p
192
+ 5
193
+ I
194
+ 0
195
+ I
196
+ 5
197
+ I
198
+ 0
199
+ I
200
+ 6
201
+ I
202
+ e
203
+ x
204
+ 62
205
+ /Users/haruki_zaemon/Projects/hamster/lib/hamster/undefined.rb
206
+ p
207
+ 1
208
+ x
209
+ 5
210
+ value
211
+ x
212
+ 13
213
+ attach_method
214
+ p
215
+ 3
216
+ I
217
+ 2
218
+ I
219
+ 5
220
+ I
221
+ d
222
+ x
223
+ 62
224
+ /Users/haruki_zaemon/Projects/hamster/lib/hamster/undefined.rb
225
+ p
226
+ 0
227
+ x
228
+ 13
229
+ attach_method
230
+ p
231
+ 3
232
+ I
233
+ 2
234
+ I
235
+ 3
236
+ I
237
+ 1c
238
+ x
239
+ 62
240
+ /Users/haruki_zaemon/Projects/hamster/lib/hamster/undefined.rb
241
+ p
242
+ 0
243
+ x
244
+ 13
245
+ attach_method
246
+ p
247
+ 3
248
+ I
249
+ 0
250
+ I
251
+ 1
252
+ I
253
+ 1c
254
+ x
255
+ 62
256
+ /Users/haruki_zaemon/Projects/hamster/lib/hamster/undefined.rb
257
+ p
258
+ 0
@@ -0,0 +1,157 @@
1
+ require 'forwardable'
2
+
3
+ require 'hamster/undefined'
4
+ require 'hamster/immutable'
5
+ require 'hamster/enumerable'
6
+
7
+ module Hamster
8
+
9
+ def self.vector(*items)
10
+ items.reduce(EmptyVector) { |vector, item| vector.add(item) }
11
+ end
12
+
13
+ class Vector
14
+
15
+ extend Forwardable
16
+
17
+ include Immutable
18
+
19
+ include Enumerable
20
+
21
+ BLOCK_SIZE = 32
22
+ INDEX_MASK = BLOCK_SIZE - 1
23
+ BITS_PER_LEVEL = 5
24
+
25
+ def initialize
26
+ @levels = 0
27
+ @root = []
28
+ @size = 0
29
+ end
30
+
31
+ def empty?
32
+ @size == 0
33
+ end
34
+ def_delegator :self, :empty?, :null?
35
+
36
+ def size
37
+ @size
38
+ end
39
+ def_delegator :self, :size, :length
40
+
41
+ def first
42
+ get(0)
43
+ end
44
+ def_delegator :self, :first, :head
45
+
46
+ def last
47
+ get(-1)
48
+ end
49
+
50
+ def add(item)
51
+ transform do
52
+ update_leaf_node(@size, item)
53
+ @size += 1
54
+ end
55
+ end
56
+ def_delegator :self, :add, :<<
57
+ def_delegator :self, :add, :cons
58
+
59
+ # def delete(index)
60
+ # end
61
+
62
+ def set(index, item = Undefined)
63
+ return set(index, yield(get(index))) if item.equal?(Undefined)
64
+ raise IndexError if empty? or index == @size
65
+ raise IndexError if index.abs > @size
66
+ return set(@size + index, item) if index < 0
67
+ transform do
68
+ update_leaf_node(index, item)
69
+ end
70
+ end
71
+
72
+ def get(index)
73
+ return nil if empty? or index == @size
74
+ return nil if index.abs > @size
75
+ return get(@size + index) if index < 0
76
+ leaf_node_for(@root, root_index_bits, index)[index & INDEX_MASK]
77
+ end
78
+ def_delegator :self, :get, :[]
79
+ def_delegator :self, :get, :at
80
+
81
+ def each(&block)
82
+ return self unless block_given?
83
+ traverse_depth_first(&block)
84
+ nil
85
+ end
86
+
87
+ def filter
88
+ return self unless block_given?
89
+ reduce(EmptyVector) { |vector, item| yield(item) ? vector.add(item) : vector }
90
+ end
91
+
92
+ def clear
93
+ EmptyVector
94
+ end
95
+
96
+ def inspect
97
+ to_a.inspect
98
+ end
99
+
100
+ def eql?(other)
101
+ return true if other.equal?(self)
102
+ return false unless instance_of?(other.class) && @size == other.size
103
+ @root.eql?(other.instance_variable_get(:@root))
104
+ end
105
+ def_delegator :self, :eql?, :==
106
+
107
+ private
108
+
109
+ def traverse_depth_first(node = @root, level = @levels, &block)
110
+ return node.each(&block) if level == 0
111
+ node.each { |child| traverse_depth_first(child, level - 1, &block) }
112
+ end
113
+
114
+ def leaf_node_for(node, child_index_bits, index)
115
+ return node if child_index_bits == 0
116
+ child_index = (index >> child_index_bits) & INDEX_MASK
117
+ leaf_node_for(node[child_index], child_index_bits - BITS_PER_LEVEL, index)
118
+ end
119
+
120
+ def update_leaf_node(index, item)
121
+ copy_leaf_node_for(new_root, root_index_bits, index)[index & INDEX_MASK] = item
122
+ end
123
+
124
+ def copy_leaf_node_for(node, child_index_bits, index)
125
+ return node if child_index_bits == 0
126
+ child_index = (index >> child_index_bits) & INDEX_MASK
127
+ if child_node = node[child_index]
128
+ child_node = child_node.dup
129
+ else
130
+ child_node = []
131
+ end
132
+ node[child_index] = child_node
133
+ copy_leaf_node_for(child_node, child_index_bits - BITS_PER_LEVEL, index)
134
+ end
135
+
136
+ def new_root
137
+ if full?
138
+ @levels += 1
139
+ @root = [@root]
140
+ else
141
+ @root = @root.dup
142
+ end
143
+ end
144
+
145
+ def full?
146
+ (@size >> root_index_bits) > 0
147
+ end
148
+
149
+ def root_index_bits
150
+ @levels * BITS_PER_LEVEL
151
+ end
152
+
153
+ end
154
+
155
+ EmptyVector = Vector.new
156
+
157
+ end
@@ -1,5 +1,5 @@
1
1
  module Hamster
2
2
 
3
- VERSION = "0.3.10".freeze
3
+ VERSION = "0.4.0".freeze
4
4
 
5
5
  end
@@ -0,0 +1,136 @@
1
+ !RBIX
2
+ 0
3
+ x
4
+ M
5
+ 1
6
+ n
7
+ n
8
+ x
9
+ 10
10
+ __script__
11
+ i
12
+ 28
13
+ 99
14
+ 7
15
+ 0
16
+ 65
17
+ 49
18
+ 1
19
+ 2
20
+ 13
21
+ 99
22
+ 12
23
+ 7
24
+ 2
25
+ 12
26
+ 7
27
+ 3
28
+ 12
29
+ 65
30
+ 12
31
+ 49
32
+ 4
33
+ 4
34
+ 15
35
+ 49
36
+ 2
37
+ 0
38
+ 15
39
+ 2
40
+ 11
41
+ I
42
+ 6
43
+ I
44
+ 0
45
+ I
46
+ 0
47
+ I
48
+ 0
49
+ n
50
+ p
51
+ 5
52
+ x
53
+ 7
54
+ Hamster
55
+ x
56
+ 11
57
+ open_module
58
+ x
59
+ 15
60
+ __module_init__
61
+ M
62
+ 1
63
+ n
64
+ n
65
+ x
66
+ 7
67
+ Hamster
68
+ i
69
+ 15
70
+ 5
71
+ 66
72
+ 65
73
+ 7
74
+ 0
75
+ 7
76
+ 1
77
+ 64
78
+ 49
79
+ 2
80
+ 0
81
+ 49
82
+ 3
83
+ 2
84
+ 11
85
+ I
86
+ 3
87
+ I
88
+ 0
89
+ I
90
+ 0
91
+ I
92
+ 0
93
+ n
94
+ p
95
+ 4
96
+ x
97
+ 7
98
+ VERSION
99
+ s
100
+ 6
101
+ 0.3.10
102
+ x
103
+ 6
104
+ freeze
105
+ x
106
+ 9
107
+ const_set
108
+ p
109
+ 3
110
+ I
111
+ 2
112
+ I
113
+ 3
114
+ I
115
+ f
116
+ x
117
+ 60
118
+ /Users/haruki_zaemon/Projects/hamster/lib/hamster/version.rb
119
+ p
120
+ 0
121
+ x
122
+ 13
123
+ attach_method
124
+ p
125
+ 3
126
+ I
127
+ 0
128
+ I
129
+ 1
130
+ I
131
+ 1c
132
+ x
133
+ 60
134
+ /Users/haruki_zaemon/Projects/hamster/lib/hamster/version.rb
135
+ p
136
+ 0