array-sorted 1.0.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.
data/CHANGELOG.rdoc ADDED
@@ -0,0 +1,12 @@
1
+
2
+ == 6/14/2012
3
+
4
+ Initial release - split from compositing-sorted-array.
5
+
6
+ == 6/15/2012
7
+
8
+ fixed SortedArray::Interface to include Array::Sorted::ArrayInterface
9
+
10
+ == 6/30/2012
11
+
12
+ Renamed from sorted-array to array-sorted. File schema updated to reflect gem name.
data/README.md ADDED
@@ -0,0 +1,44 @@
1
+ # Sorted Array #
2
+
3
+ http://rubygems.org/gems/array-sorted
4
+
5
+ # Description #
6
+
7
+ Provides ::Array::Sorted and ::SortedArray.
8
+
9
+ # Summary #
10
+
11
+ A subclass of Array::Hooked that also keeps array sorted.
12
+
13
+ # Install #
14
+
15
+ * sudo gem install array-sorted
16
+
17
+ # Usage #
18
+
19
+ Just like Array or Array::Hooked (provided by hooked_array)! Provides additional support in :initialize to declare sorting block.
20
+
21
+ # License #
22
+
23
+ (The MIT License)
24
+
25
+ Copyright (c) Asher
26
+
27
+ Permission is hereby granted, free of charge, to any person obtaining
28
+ a copy of this software and associated documentation files (the
29
+ 'Software'), to deal in the Software without restriction, including
30
+ without limitation the rights to use, copy, modify, merge, publish,
31
+ distribute, sublicense, and/or sell copies of the Software, and to
32
+ permit persons to whom the Software is furnished to do so, subject to
33
+ the following conditions:
34
+
35
+ The above copyright notice and this permission notice shall be
36
+ included in all copies or substantial portions of the Software.
37
+
38
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
39
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
40
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
41
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
42
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
43
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
44
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,2 @@
1
+
2
+ require_relative 'array/sorted.rb'
@@ -0,0 +1,2 @@
1
+
2
+ require_relative 'array/sorted.rb'
@@ -0,0 +1,2 @@
1
+
2
+ require_relative '../sorted.rb'
@@ -0,0 +1,6 @@
1
+
2
+ class ::Array::Sorted < ::Array::Hooked
3
+ end
4
+
5
+ class ::SortedArray < ::Array::Sorted
6
+ end
@@ -0,0 +1,27 @@
1
+
2
+ basepath = 'sorted'
3
+
4
+ files = [
5
+
6
+ 'array_interface'
7
+
8
+ ]
9
+
10
+ second_basepath = '../sorted_array'
11
+
12
+ second_files = [
13
+
14
+ 'array_interface'
15
+
16
+ ]
17
+
18
+ files.each do |this_file|
19
+ require_relative( File.join( basepath, this_file ) + '.rb' )
20
+ end
21
+ second_files.each do |this_file|
22
+ require_relative( File.join( second_basepath, this_file ) + '.rb' )
23
+ end
24
+
25
+ require_relative( basepath + '.rb' )
26
+ require_relative( second_basepath + '.rb' )
27
+
@@ -0,0 +1,14 @@
1
+
2
+ require 'array/hooked'
3
+
4
+ # namespaces that have to be declared ahead of time for proper load order
5
+ require_relative './namespaces'
6
+
7
+ # source file requires
8
+ require_relative './requires.rb'
9
+
10
+ class ::Array::Sorted < ::Array::Hooked
11
+
12
+ include ::Array::Sorted::ArrayInterface
13
+
14
+ end
@@ -0,0 +1,173 @@
1
+
2
+ module ::Array::Sorted::ArrayInterface
3
+
4
+ include ::Array::Hooked::ArrayInterface
5
+
6
+ instances_identify_as!( ::Array::Sorted )
7
+
8
+ ################
9
+ # initialize #
10
+ ################
11
+
12
+ # Adds optional block for retaining sort order.
13
+ # @yield Block to use to determine sort order.
14
+ def initialize( *args, & sort_object_block )
15
+
16
+ super( *args )
17
+
18
+ if block_given?
19
+ @sort_object_block = sort_object_block
20
+ end
21
+
22
+ end
23
+
24
+ ##############
25
+ # reverse! #
26
+ ##############
27
+
28
+ def reverse!
29
+
30
+ @sort_order_reversed = ! @sort_order_reversed
31
+
32
+ super
33
+
34
+ return self
35
+
36
+ end
37
+
38
+ ##############
39
+ # collect! #
40
+ # map! #
41
+ ##############
42
+
43
+ def collect!
44
+
45
+ return to_enum unless block_given?
46
+
47
+ replacement_array = [ ]
48
+ self.each_with_index do |this_object, index|
49
+ replacement_object = yield( this_object )
50
+ replacement_array[ index ] = replacement_object
51
+ end
52
+
53
+ replace( replacement_array )
54
+
55
+ return self
56
+
57
+ end
58
+ alias_method :map!, :collect!
59
+
60
+ ###########
61
+ # sort! #
62
+ ###########
63
+
64
+ def sort!( & block )
65
+
66
+ if block_given?
67
+ self.each_with_index do |this_member, index|
68
+ unless index + 1 == count
69
+ sort_object = @sort_object_block ? @sort_object_block.call( this_member ) : this_member
70
+ yield( sort_object, self[ index + 1 ] )
71
+ end
72
+ end
73
+ end
74
+
75
+ return self
76
+
77
+ end
78
+
79
+ ##############
80
+ # sort_by! #
81
+ ##############
82
+
83
+ def sort_by!( & block )
84
+
85
+ return to_enum unless block_given?
86
+
87
+ self.each do |this_member|
88
+ sort_object = @sort_object_block ? @sort_object_block.call( this_member ) : this_member
89
+ yield( sort_object )
90
+ end
91
+
92
+ return self
93
+
94
+ end
95
+
96
+ ###############################
97
+ # perform_set_between_hooks #
98
+ ###############################
99
+
100
+ def perform_set_between_hooks( index, object )
101
+
102
+ unless index >= count
103
+ delete_at( index )
104
+ end
105
+
106
+ return perform_insert_between_hooks( index, object )
107
+
108
+ end
109
+
110
+ ##################################
111
+ # perform_insert_between_hooks #
112
+ ##################################
113
+
114
+ def perform_insert_between_hooks( index, *objects )
115
+
116
+ # we ignore the index and insert in sorted order
117
+
118
+ # we have to have at least one member for comparison-based insert (to retain sorted order)
119
+
120
+ objects.each do |this_object|
121
+
122
+ insert_occurred = false
123
+
124
+ if this_object.nil?
125
+ if @sort_order_reversed
126
+ super( count, this_object )
127
+ else
128
+ super( 0, this_object )
129
+ end
130
+ next
131
+ end
132
+
133
+ self.each_with_index do |this_member, this_index|
134
+
135
+ insert_sort_object = this_object
136
+ existing_sort_object = this_member
137
+
138
+ if @sort_object_block
139
+ insert_sort_object = @sort_object_block.call( this_object )
140
+ existing_sort_object = @sort_object_block.call( this_member )
141
+ end
142
+
143
+ if @sort_order_reversed
144
+
145
+ case insert_sort_object <=> existing_sort_object
146
+ when 0, 1
147
+ super( this_index, this_object )
148
+ insert_occurred = true
149
+ break
150
+ end
151
+
152
+ else
153
+
154
+ case insert_sort_object <=> existing_sort_object
155
+ when 0, -1
156
+ super( this_index, this_object )
157
+ insert_occurred = true
158
+ break
159
+ end
160
+
161
+ end
162
+
163
+ end
164
+
165
+ unless insert_occurred
166
+ super( count, this_object )
167
+ end
168
+
169
+ end
170
+
171
+ end
172
+
173
+ end
@@ -0,0 +1,2 @@
1
+
2
+ require_relative '../../array-sorted.rb'
@@ -0,0 +1,6 @@
1
+
2
+ class ::SortedArray < ::Array::Sorted
3
+
4
+ include ::SortedArray::Interface
5
+
6
+ end
@@ -0,0 +1,23 @@
1
+
2
+ module ::SortedArray::Interface
3
+
4
+ include ::Array::Sorted::ArrayInterface
5
+ include ::HookedArray::Interface
6
+
7
+ instances_identify_as!( ::SortedArray )
8
+
9
+ ################
10
+ # initialize #
11
+ ################
12
+
13
+ def initialize( configuration_instance = nil, & sort_object_block )
14
+
15
+ super( configuration_instance )
16
+
17
+ if block_given?
18
+ @sort_object_block = sort_object_block
19
+ end
20
+
21
+ end
22
+
23
+ end
@@ -0,0 +1,667 @@
1
+
2
+ require_relative '../../lib/array-sorted.rb'
3
+
4
+ describe ::Array::Sorted do
5
+
6
+ ################
7
+ # initialize #
8
+ ################
9
+
10
+ it 'can add initialize with an ancestor, inheriting its values and linking to it as a child' do
11
+
12
+ sorted_array = ::Array::Sorted.new
13
+
14
+ sorted_array.should == [ ]
15
+
16
+ end
17
+
18
+ #########
19
+ # []= #
20
+ #########
21
+
22
+ it 'can add elements' do
23
+
24
+ sorted_array = ::Array::Sorted.new
25
+
26
+ sorted_array[ 0 ] = :A
27
+ sorted_array.should == [ :A ]
28
+
29
+ sorted_array[ 1 ] = :B
30
+ sorted_array.should == [ :A, :B ]
31
+
32
+ sorted_array[ 0 ] = :D
33
+ sorted_array.should == [ :B, :D ]
34
+
35
+ end
36
+
37
+ ############
38
+ # insert #
39
+ ############
40
+
41
+ it 'can insert elements' do
42
+
43
+ sorted_array = ::Array::Sorted.new
44
+
45
+ sorted_array.insert( 3, :D )
46
+ sorted_array.should == [ nil, nil, nil, :D ]
47
+
48
+ sorted_array.insert( 1, :B )
49
+ sorted_array.should == [ nil, nil, nil, :B, :D ]
50
+
51
+ sorted_array.insert( 2, :C )
52
+ sorted_array.should == [ nil, nil, nil, :B, :C, :D ]
53
+
54
+ end
55
+
56
+ ##########
57
+ # push #
58
+ # << #
59
+ ##########
60
+
61
+ it 'can add elements' do
62
+
63
+ sorted_array = ::Array::Sorted.new
64
+
65
+ sorted_array << :A
66
+ sorted_array.should == [ :A ]
67
+
68
+ sorted_array << :B
69
+ sorted_array.should == [ :A, :B ]
70
+
71
+ end
72
+
73
+ ############
74
+ # concat #
75
+ # + #
76
+ ############
77
+
78
+ it 'can add elements' do
79
+
80
+ # NOTE: this breaks + by causing it to modify the array like +=
81
+ # The alternative was worse.
82
+
83
+ sorted_array = ::Array::Sorted.new
84
+
85
+ sorted_array.concat( [ :A ] )
86
+ sorted_array.should == [ :A ]
87
+
88
+ sorted_array += [ :B ]
89
+ sorted_array.should == [ :A, :B ]
90
+
91
+ end
92
+
93
+ ####################
94
+ # delete_objects #
95
+ ####################
96
+
97
+ it 'can delete multiple elements' do
98
+
99
+ sorted_array = ::Array::Sorted.new
100
+
101
+ sorted_array += [ :A, :B ]
102
+ sorted_array.should == [ :A, :B ]
103
+
104
+ sorted_array.delete_objects( :A, :B )
105
+ sorted_array.should == [ ]
106
+
107
+ end
108
+
109
+ #######
110
+ # - #
111
+ #######
112
+
113
+ it 'can exclude elements' do
114
+
115
+ sorted_array = ::Array::Sorted.new
116
+
117
+ sorted_array.push( :A )
118
+ sorted_array.should == [ :A ]
119
+
120
+ sorted_array -= [ :A ]
121
+ sorted_array.should == [ ]
122
+
123
+ sorted_array.push( :B )
124
+ sorted_array.should == [ :B ]
125
+
126
+ end
127
+
128
+ ############
129
+ # delete #
130
+ ############
131
+
132
+ it 'can delete elements' do
133
+
134
+ sorted_array = ::Array::Sorted.new
135
+
136
+ sorted_array.push( :A )
137
+ sorted_array.should == [ :A ]
138
+
139
+ sorted_array.delete( :A )
140
+ sorted_array.should == [ ]
141
+
142
+ sorted_array.push( :B )
143
+ sorted_array.should == [ :B ]
144
+
145
+ end
146
+
147
+ ###############
148
+ # delete_at #
149
+ ###############
150
+
151
+ it 'can delete by indexes' do
152
+
153
+ sorted_array = ::Array::Sorted.new
154
+
155
+ sorted_array.push( :A )
156
+ sorted_array.should == [ :A ]
157
+
158
+ sorted_array.delete_at( 0 )
159
+ sorted_array.should == [ ]
160
+
161
+ sorted_array.push( :B )
162
+ sorted_array.should == [ :B ]
163
+
164
+ end
165
+
166
+ #######################
167
+ # delete_at_indexes #
168
+ #######################
169
+
170
+ it 'can delete by indexes' do
171
+
172
+ sorted_array = ::Array::Sorted.new
173
+
174
+ sorted_array.push( :A, :B, :C )
175
+ sorted_array.should == [ :A, :B, :C ]
176
+
177
+ sorted_array.delete_at_indexes( 0, 1 )
178
+ sorted_array.should == [ :C ]
179
+
180
+ end
181
+
182
+ ###############
183
+ # delete_if #
184
+ ###############
185
+
186
+ it 'can delete by block' do
187
+
188
+ sorted_array = ::Array::Sorted.new
189
+
190
+ sorted_array.push( :A, :B, :C )
191
+ sorted_array.should == [ :A, :B, :C ]
192
+ sorted_array.delete_if do |object|
193
+ object != :C
194
+ end
195
+ sorted_array.should == [ :C ]
196
+
197
+ sorted_array.delete_if.is_a?( Enumerator ).should == true
198
+
199
+ end
200
+
201
+ #############
202
+ # keep_if #
203
+ #############
204
+
205
+ it 'can keep by block' do
206
+
207
+ sorted_array = ::Array::Sorted.new
208
+
209
+ sorted_array.push( :A, :B, :C )
210
+ sorted_array.should == [ :A, :B, :C ]
211
+ sorted_array.keep_if do |object|
212
+ object == :C
213
+ end
214
+ sorted_array.should == [ :C ]
215
+
216
+ end
217
+
218
+ ##############
219
+ # compact! #
220
+ ##############
221
+
222
+ it 'can compact' do
223
+
224
+ sorted_array = ::Array::Sorted.new
225
+
226
+ sorted_array.push( :A, nil, :B, nil, :C, nil )
227
+ sorted_array.should == [ nil, nil, nil, :A, :B, :C ]
228
+ sorted_array.compact!
229
+ sorted_array.should == [ :A, :B, :C ]
230
+
231
+ end
232
+
233
+ ##############
234
+ # flatten! #
235
+ ##############
236
+
237
+ it 'can flatten' do
238
+
239
+ sorted_array = ::Array::Sorted.new
240
+
241
+ sorted_array.push( :A, [ :F_A, :F_B ], :B, [ :F_C ], :C, [ :F_D ], [ :F_E ] )
242
+ sorted_array.should == [ :A, [ :F_A, :F_B ], :B, [ :F_C ], :C, [ :F_D ], [ :F_E ] ]
243
+ sorted_array.flatten!
244
+ sorted_array.should == [ :A, :B, :C, :F_A, :F_B, :F_C, :F_D, :F_E ]
245
+
246
+ end
247
+
248
+ #############
249
+ # reject! #
250
+ #############
251
+
252
+ it 'can reject' do
253
+
254
+ sorted_array = ::Array::Sorted.new
255
+
256
+ sorted_array.push( :A, :B, :C )
257
+ sorted_array.should == [ :A, :B, :C ]
258
+ sorted_array.reject! do |object|
259
+ object != :C
260
+ end
261
+ sorted_array.should == [ :C ]
262
+
263
+ sorted_array.reject!.is_a?( Enumerator ).should == true
264
+
265
+ end
266
+
267
+ #############
268
+ # replace #
269
+ #############
270
+
271
+ it 'can replace self' do
272
+
273
+ sorted_array = ::Array::Sorted.new
274
+
275
+ sorted_array.push( :A, :B, :C )
276
+ sorted_array.should == [ :A, :B, :C ]
277
+ sorted_array.replace( [ :D, :E, :F ] )
278
+ sorted_array.should == [ :D, :E, :F ]
279
+
280
+ end
281
+
282
+ ##############
283
+ # reverse! #
284
+ ##############
285
+
286
+ it 'can reverse self' do
287
+
288
+ sorted_array = ::Array::Sorted.new
289
+
290
+ sorted_array.push( :A, :B, :C )
291
+ sorted_array.should == [ :A, :B, :C ]
292
+ sorted_array.reverse!
293
+ sorted_array.should == [ :C, :B, :A ]
294
+
295
+ end
296
+
297
+ #############
298
+ # rotate! #
299
+ #############
300
+
301
+ it 'can rotate self' do
302
+
303
+ sorted_array = ::Array::Sorted.new
304
+
305
+ sorted_array.push( :A, :B, :C )
306
+ sorted_array.should == [ :A, :B, :C ]
307
+
308
+ sorted_array.rotate!
309
+ sorted_array.should == [ :A, :B, :C ]
310
+
311
+ sorted_array.rotate!( -1 )
312
+ sorted_array.should == [ :A, :B, :C ]
313
+
314
+ end
315
+
316
+ #############
317
+ # select! #
318
+ #############
319
+
320
+ it 'can keep by select' do
321
+
322
+ sorted_array = ::Array::Sorted.new
323
+
324
+ sorted_array.push( :A, :B, :C )
325
+ sorted_array.should == [ :A, :B, :C ]
326
+ sorted_array.select! do |object|
327
+ object == :C
328
+ end
329
+ sorted_array.should == [ :C ]
330
+
331
+ sorted_array.select!.is_a?( Enumerator ).should == true
332
+
333
+ end
334
+
335
+ ##############
336
+ # shuffle! #
337
+ ##############
338
+
339
+ it 'can shuffle self' do
340
+
341
+ sorted_array = ::Array::Sorted.new
342
+
343
+ sorted_array.push( :A, :B, :C )
344
+ sorted_array.should == [ :A, :B, :C ]
345
+
346
+ first_shuffle_version = sorted_array.dup
347
+ sorted_array.shuffle!
348
+ sorted_array.should == first_shuffle_version
349
+
350
+ end
351
+
352
+ ##############
353
+ # collect! #
354
+ # map! #
355
+ ##############
356
+
357
+ it 'can replace by collect/map' do
358
+
359
+ sorted_array = ::Array::Sorted.new
360
+
361
+ sorted_array.push( :A, :B, :C )
362
+ sorted_array.should == [ :A, :B, :C ]
363
+ sorted_array.collect! do |object|
364
+ :C
365
+ end
366
+ sorted_array.should == [ :C, :C, :C ]
367
+
368
+ sorted_array.collect!.is_a?( Enumerator ).should == true
369
+
370
+ end
371
+
372
+ ###########
373
+ # sort! #
374
+ ###########
375
+
376
+ it 'can replace by collect/map' do
377
+
378
+ sorted_array = ::Array::Sorted.new
379
+
380
+ sorted_array.push( :A, :B, :C )
381
+ sorted_array.should == [ :A, :B, :C ]
382
+ sorted_array.sort! do |a, b|
383
+ if a < b
384
+ 1
385
+ elsif a > b
386
+ -1
387
+ elsif a == b
388
+ 0
389
+ end
390
+ end
391
+ sorted_array.should == [ :A, :B, :C ]
392
+
393
+ sorted_array.sort!
394
+ sorted_array.should == [ :A, :B, :C ]
395
+
396
+ end
397
+
398
+ ##############
399
+ # sort_by! #
400
+ ##############
401
+
402
+ it 'can replace by collect/map' do
403
+
404
+ sorted_array = ::Array::Sorted.new
405
+
406
+ sorted_array.push( :A, :B, :C )
407
+ sorted_array.should == [ :A, :B, :C ]
408
+ sorted_array.sort_by! do |object|
409
+ case object
410
+ when :A
411
+ :B
412
+ when :B
413
+ :A
414
+ when :C
415
+ :C
416
+ end
417
+ end
418
+ sorted_array.should == [ :A, :B, :C ]
419
+
420
+ sorted_array.sort_by!.is_a?( Enumerator ).should == true
421
+
422
+ end
423
+
424
+ ###########
425
+ # uniq! #
426
+ ###########
427
+
428
+ it 'can remove non-unique elements' do
429
+
430
+ sorted_array = ::Array::Sorted.new
431
+
432
+ sorted_array.push( :A, :B, :C, :C, :C, :B, :A )
433
+ sorted_array.should == [ :A, :A, :B, :B, :C, :C, :C ]
434
+ sorted_array.uniq!
435
+ sorted_array.should == [ :A, :B, :C ]
436
+
437
+ end
438
+
439
+ #############
440
+ # unshift #
441
+ #############
442
+
443
+ it 'can unshift onto the first element' do
444
+
445
+ sorted_array = ::Array::Sorted.new
446
+
447
+ sorted_array += :A
448
+ sorted_array.should == [ :A ]
449
+
450
+ sorted_array.unshift( :B )
451
+ sorted_array.should == [ :A, :B ]
452
+
453
+ end
454
+
455
+ #########
456
+ # pop #
457
+ #########
458
+
459
+ it 'can pop the final element' do
460
+
461
+ sorted_array = ::Array::Sorted.new
462
+
463
+ sorted_array += :A
464
+ sorted_array.should == [ :A ]
465
+
466
+ sorted_array.pop.should == :A
467
+ sorted_array.should == [ ]
468
+
469
+ sorted_array += :B
470
+ sorted_array.should == [ :B ]
471
+
472
+ end
473
+
474
+ ###########
475
+ # shift #
476
+ ###########
477
+
478
+ it 'can shift the first element' do
479
+
480
+ sorted_array = ::Array::Sorted.new
481
+
482
+ sorted_array += :A
483
+ sorted_array.should == [ :A ]
484
+
485
+ sorted_array.shift.should == :A
486
+ sorted_array.should == [ ]
487
+
488
+ sorted_array += :B
489
+ sorted_array.should == [ :B ]
490
+
491
+ end
492
+
493
+ ############
494
+ # slice! #
495
+ ############
496
+
497
+ it 'can slice elements' do
498
+
499
+ sorted_array = ::Array::Sorted.new
500
+
501
+ sorted_array += :A
502
+ sorted_array.should == [ :A ]
503
+
504
+ sorted_array.slice!( 0, 1 ).should == [ :A ]
505
+ sorted_array.should == [ ]
506
+
507
+ sorted_array += :B
508
+ sorted_array.should == [ :B ]
509
+
510
+ end
511
+
512
+ ###########
513
+ # clear #
514
+ ###########
515
+
516
+ it 'can clear, causing present elements to be excluded' do
517
+
518
+ sorted_array = ::Array::Sorted.new
519
+
520
+ sorted_array += :A
521
+ sorted_array.should == [ :A ]
522
+
523
+ sorted_array.clear
524
+ sorted_array.should == [ ]
525
+
526
+ sorted_array += :B
527
+ sorted_array.should == [ :B ]
528
+
529
+ end
530
+
531
+ ##################
532
+ # pre_set_hook #
533
+ ##################
534
+
535
+ it 'has a hook that is called before setting a value; return value is used in place of object' do
536
+
537
+ class ::Array::Sorted::SubMockPreSet < ::Array::Sorted
538
+
539
+ def pre_set_hook( index, object, is_insert = false )
540
+ return :some_other_value
541
+ end
542
+
543
+ end
544
+
545
+ sorted_array = ::Array::Sorted::SubMockPreSet.new
546
+
547
+ sorted_array.push( :some_value )
548
+
549
+ sorted_array.should == [ :some_other_value ]
550
+
551
+ end
552
+
553
+ ###################
554
+ # post_set_hook #
555
+ ###################
556
+
557
+ it 'has a hook that is called after setting a value' do
558
+
559
+ class ::Array::Sorted::SubMockPostSet < ::Array::Sorted
560
+
561
+ def post_set_hook( index, object, is_insert = false )
562
+ return :some_other_value
563
+ end
564
+
565
+ end
566
+
567
+ sorted_array = ::Array::Sorted::SubMockPostSet.new
568
+
569
+ sorted_array.push( :some_value ).should == [ :some_other_value ]
570
+
571
+ sorted_array.should == [ :some_value ]
572
+
573
+ end
574
+
575
+ ##################
576
+ # pre_get_hook #
577
+ ##################
578
+
579
+ it 'has a hook that is called before getting a value; if return value is false, get does not occur' do
580
+
581
+ class ::Array::Sorted::SubMockPreGet < ::Array::Sorted
582
+
583
+ def pre_get_hook( index )
584
+ return false
585
+ end
586
+
587
+ end
588
+
589
+ sorted_array = ::Array::Sorted::SubMockPreGet.new
590
+
591
+ sorted_array.push( :some_value )
592
+ sorted_array[ 0 ].should == nil
593
+
594
+ sorted_array.should == [ :some_value ]
595
+
596
+ end
597
+
598
+ ###################
599
+ # post_get_hook #
600
+ ###################
601
+
602
+ it 'has a hook that is called after getting a value' do
603
+
604
+ class ::Array::Sorted::SubMockPostGet < ::Array::Sorted
605
+
606
+ def post_get_hook( index, object )
607
+ return :some_other_value
608
+ end
609
+
610
+ end
611
+
612
+ sorted_array = ::Array::Sorted::SubMockPostGet.new
613
+
614
+ sorted_array.push( :some_value )
615
+ sorted_array[ 0 ].should == :some_other_value
616
+
617
+ sorted_array.should == [ :some_value ]
618
+
619
+ end
620
+
621
+ #####################
622
+ # pre_delete_hook #
623
+ #####################
624
+
625
+ it 'has a hook that is called before deleting an index; if return value is false, delete does not occur' do
626
+
627
+ class ::Array::Sorted::SubMockPreDelete < ::Array::Sorted
628
+
629
+ def pre_delete_hook( index )
630
+ return false
631
+ end
632
+
633
+ end
634
+
635
+ sorted_array = ::Array::Sorted::SubMockPreDelete.new
636
+
637
+ sorted_array.push( :some_value )
638
+ sorted_array.delete_at( 0 )
639
+
640
+ sorted_array.should == [ :some_value ]
641
+
642
+ end
643
+
644
+ ######################
645
+ # post_delete_hook #
646
+ ######################
647
+
648
+ it 'has a hook that is called after deleting an index' do
649
+
650
+ class ::Array::Sorted::SubMockPostDelete < ::Array::Sorted
651
+
652
+ def post_delete_hook( index, object )
653
+ return :some_other_value
654
+ end
655
+
656
+ end
657
+
658
+ sorted_array = ::Array::Sorted::SubMockPostDelete.new
659
+
660
+ sorted_array.push( :some_value )
661
+ sorted_array.delete_at( 0 ).should == :some_other_value
662
+
663
+ sorted_array.should == [ ]
664
+
665
+ end
666
+
667
+ end
metadata ADDED
@@ -0,0 +1,74 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: array-sorted
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Asher
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-06-30 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: array-hooked
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ description: A subclass of Array::Hooked that also keeps array sorted.
31
+ email: asher@ridiculouspower.com
32
+ executables: []
33
+ extensions: []
34
+ extra_rdoc_files: []
35
+ files:
36
+ - lib/array/hooked/sorted.rb
37
+ - lib/array/namespaces.rb
38
+ - lib/array/requires.rb
39
+ - lib/array/sorted/array_interface.rb
40
+ - lib/array/sorted.rb
41
+ - lib/array-hooked-sorted.rb
42
+ - lib/array-sorted.rb
43
+ - lib/hooked/array/sorted.rb
44
+ - lib/sorted_array/array_interface.rb
45
+ - lib/sorted_array.rb
46
+ - spec/array/sorted_spec.rb
47
+ - README.md
48
+ - CHANGELOG.rdoc
49
+ homepage: http://rubygems.org/gems/array-sorted
50
+ licenses: []
51
+ post_install_message:
52
+ rdoc_options: []
53
+ require_paths:
54
+ - lib
55
+ required_ruby_version: !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ! '>='
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ required_rubygems_version: !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ! '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ requirements: []
68
+ rubyforge_project: array-sorted
69
+ rubygems_version: 1.8.23
70
+ signing_key:
71
+ specification_version: 3
72
+ summary: Provides Array::Sorted and SortedArray.
73
+ test_files: []
74
+ has_rdoc: