hamster 0.3.10 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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