-
Notifications
You must be signed in to change notification settings - Fork 216
/
Copy patharray.rbs
2002 lines (1886 loc) · 72.6 KB
/
array.rbs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
# Arrays are ordered, integer-indexed collections of any object.
#
# Array indexing starts at 0, as in C or Java. A negative index is assumed to
# be relative to the end of the array---that is, an index of -1 indicates the
# last element of the array, -2 is the next to last element in the array, and so
# on.
#
# ## Creating Arrays
#
# A new array can be created by using the literal constructor `[]`. Arrays can
# contain different types of objects. For example, the array below contains an
# Integer, a String and a Float:
#
# ary = [1, "two", 3.0] #=> [1, "two", 3.0]
#
# An array can also be created by explicitly calling Array.new with zero, one
# (the initial size of the Array) or two arguments (the initial size and a
# default object).
#
# ary = Array.new #=> []
# Array.new(3) #=> [nil, nil, nil]
# Array.new(3, true) #=> [true, true, true]
#
# Note that the second argument populates the array with references to the same
# object. Therefore, it is only recommended in cases when you need to
# instantiate arrays with natively immutable objects such as Symbols, numbers,
# true or false.
#
# To create an array with separate objects a block can be passed instead. This
# method is safe to use with mutable objects such as hashes, strings or other
# arrays:
#
# Array.new(4) {Hash.new} #=> [{}, {}, {}, {}]
# Array.new(4) {|i| i.to_s } #=> ["0", "1", "2", "3"]
#
# This is also a quick way to build up multi-dimensional arrays:
#
# empty_table = Array.new(3) {Array.new(3)}
# #=> [[nil, nil, nil], [nil, nil, nil], [nil, nil, nil]]
#
# An array can also be created by using the Array() method, provided by Kernel,
# which tries to call #to_ary, then #to_a on its argument.
#
# Array({:a => "a", :b => "b"}) #=> [[:a, "a"], [:b, "b"]]
#
# ## Example Usage
#
# In addition to the methods it mixes in through the Enumerable module, the
# Array class has proprietary methods for accessing, searching and otherwise
# manipulating arrays.
#
# Some of the more common ones are illustrated below.
#
# ## Accessing Elements
#
# Elements in an array can be retrieved using the Array#[] method. It can take
# a single integer argument (a numeric index), a pair of arguments (start and
# length) or a range. Negative indices start counting from the end, with -1
# being the last element.
#
# arr = [1, 2, 3, 4, 5, 6]
# arr[2] #=> 3
# arr[100] #=> nil
# arr[-3] #=> 4
# arr[2, 3] #=> [3, 4, 5]
# arr[1..4] #=> [2, 3, 4, 5]
# arr[1..-3] #=> [2, 3, 4]
#
# Another way to access a particular array element is by using the #at method
#
# arr.at(0) #=> 1
#
# The #slice method works in an identical manner to Array#[].
#
# To raise an error for indices outside of the array bounds or else to provide a
# default value when that happens, you can use #fetch.
#
# arr = ['a', 'b', 'c', 'd', 'e', 'f']
# arr.fetch(100) #=> IndexError: index 100 outside of array bounds: -6...6
# arr.fetch(100, "oops") #=> "oops"
#
# The special methods #first and #last will return the first and last elements
# of an array, respectively.
#
# arr.first #=> 1
# arr.last #=> 6
#
# To return the first `n` elements of an array, use #take
#
# arr.take(3) #=> [1, 2, 3]
#
# #drop does the opposite of #take, by returning the elements after `n` elements
# have been dropped:
#
# arr.drop(3) #=> [4, 5, 6]
#
# ## Obtaining Information about an Array
#
# Arrays keep track of their own length at all times. To query an array about
# the number of elements it contains, use #length, #count or #size.
#
# browsers = ['Chrome', 'Firefox', 'Safari', 'Opera', 'IE']
# browsers.length #=> 5
# browsers.count #=> 5
#
# To check whether an array contains any elements at all
#
# browsers.empty? #=> false
#
# To check whether a particular item is included in the array
#
# browsers.include?('Konqueror') #=> false
#
# ## Adding Items to Arrays
#
# Items can be added to the end of an array by using either #push or #<<
#
# arr = [1, 2, 3, 4]
# arr.push(5) #=> [1, 2, 3, 4, 5]
# arr << 6 #=> [1, 2, 3, 4, 5, 6]
#
# #unshift will add a new item to the beginning of an array.
#
# arr.unshift(0) #=> [0, 1, 2, 3, 4, 5, 6]
#
# With #insert you can add a new element to an array at any position.
#
# arr.insert(3, 'apple') #=> [0, 1, 2, 'apple', 3, 4, 5, 6]
#
# Using the #insert method, you can also insert multiple values at once:
#
# arr.insert(3, 'orange', 'pear', 'grapefruit')
# #=> [0, 1, 2, "orange", "pear", "grapefruit", "apple", 3, 4, 5, 6]
#
# ## Removing Items from an Array
#
# The method #pop removes the last element in an array and returns it:
#
# arr = [1, 2, 3, 4, 5, 6]
# arr.pop #=> 6
# arr #=> [1, 2, 3, 4, 5]
#
# To retrieve and at the same time remove the first item, use #shift:
#
# arr.shift #=> 1
# arr #=> [2, 3, 4, 5]
#
# To delete an element at a particular index:
#
# arr.delete_at(2) #=> 4
# arr #=> [2, 3, 5]
#
# To delete a particular element anywhere in an array, use #delete:
#
# arr = [1, 2, 2, 3]
# arr.delete(2) #=> 2
# arr #=> [1,3]
#
# A useful method if you need to remove `nil` values from an array is #compact:
#
# arr = ['foo', 0, nil, 'bar', 7, 'baz', nil]
# arr.compact #=> ['foo', 0, 'bar', 7, 'baz']
# arr #=> ['foo', 0, nil, 'bar', 7, 'baz', nil]
# arr.compact! #=> ['foo', 0, 'bar', 7, 'baz']
# arr #=> ['foo', 0, 'bar', 7, 'baz']
#
# Another common need is to remove duplicate elements from an array.
#
# It has the non-destructive #uniq, and destructive method #uniq!
#
# arr = [2, 5, 6, 556, 6, 6, 8, 9, 0, 123, 556]
# arr.uniq #=> [2, 5, 6, 556, 8, 9, 0, 123]
#
# ## Iterating over Arrays
#
# Like all classes that include the Enumerable module, Array has an each method,
# which defines what elements should be iterated over and how. In case of
# Array's #each, all elements in the Array instance are yielded to the supplied
# block in sequence.
#
# Note that this operation leaves the array unchanged.
#
# arr = [1, 2, 3, 4, 5]
# arr.each {|a| print a -= 10, " "}
# # prints: -9 -8 -7 -6 -5
# #=> [1, 2, 3, 4, 5]
#
# Another sometimes useful iterator is #reverse_each which will iterate over the
# elements in the array in reverse order.
#
# words = %w[first second third fourth fifth sixth]
# str = ""
# words.reverse_each {|word| str += "#{word} "}
# p str #=> "sixth fifth fourth third second first "
#
# The #map method can be used to create a new array based on the original array,
# but with the values modified by the supplied block:
#
# arr.map {|a| 2*a} #=> [2, 4, 6, 8, 10]
# arr #=> [1, 2, 3, 4, 5]
# arr.map! {|a| a**2} #=> [1, 4, 9, 16, 25]
# arr #=> [1, 4, 9, 16, 25]
#
# ## Selecting Items from an Array
#
# Elements can be selected from an array according to criteria defined in a
# block. The selection can happen in a destructive or a non-destructive manner.
# While the destructive operations will modify the array they were called on,
# the non-destructive methods usually return a new array with the selected
# elements, but leave the original array unchanged.
#
# ### Non-destructive Selection
#
# arr = [1, 2, 3, 4, 5, 6]
# arr.select {|a| a > 3} #=> [4, 5, 6]
# arr.reject {|a| a < 3} #=> [3, 4, 5, 6]
# arr.drop_while {|a| a < 4} #=> [4, 5, 6]
# arr #=> [1, 2, 3, 4, 5, 6]
#
# ### Destructive Selection
#
# #select! and #reject! are the corresponding destructive methods to #select and
# #reject
#
# Similar to #select vs. #reject, #delete_if and #keep_if have the exact
# opposite result when supplied with the same block:
#
# arr.delete_if {|a| a < 4} #=> [4, 5, 6]
# arr #=> [4, 5, 6]
#
# arr = [1, 2, 3, 4, 5, 6]
# arr.keep_if {|a| a < 4} #=> [1, 2, 3]
# arr #=> [1, 2, 3]
# for pack.c
#
class Array[unchecked out Elem] < Object
include Enumerable[Elem, self]
# Returns a new array.
#
# In the first form, if no arguments are sent, the new array will be empty. When
# a `size` and an optional `default` are sent, an array is created with `size`
# copies of `default`. Take notice that all elements will reference the same
# object `default`.
#
# The second form creates a copy of the array passed as a parameter (the array
# is generated by calling to_ary on the parameter).
#
# first_array = ["Matz", "Guido"]
#
# second_array = Array.new(first_array) #=> ["Matz", "Guido"]
#
# first_array.equal? second_array #=> false
#
# In the last form, an array of the given size is created. Each element in this
# array is created by passing the element's index to the given block and storing
# the return value.
#
# Array.new(3) {|index| index ** 2}
# # => [0, 1, 4]
#
# ## Common gotchas
#
# When sending the second parameter, the same object will be used as the value
# for all the array elements:
#
# a = Array.new(2, Hash.new)
# # => [{}, {}]
#
# a[0]['cat'] = 'feline'
# a # => [{"cat"=>"feline"}, {"cat"=>"feline"}]
#
# a[1]['cat'] = 'Felix'
# a # => [{"cat"=>"Felix"}, {"cat"=>"Felix"}]
#
# Since all the Array elements store the same hash, changes to one of them will
# affect them all.
#
# If multiple copies are what you want, you should use the block version which
# uses the result of that block each time an element of the array needs to be
# initialized:
#
# a = Array.new(2) {Hash.new}
# a[0]['cat'] = 'feline'
# a # => [{"cat"=>"feline"}, {}]
#
def initialize: () -> void
| (::Array[Elem] ary) -> void
| (int size, ?Elem val) -> void
| (int size) { (::Integer index) -> Elem } -> void
# Returns a new array populated with the given objects.
#
# Array.[]( 1, 'a', /^A/) # => [1, "a", /^A/]
# Array[ 1, 'a', /^A/ ] # => [1, "a", /^A/]
# [ 1, 'a', /^A/ ] # => [1, "a", /^A/]
#
def self.[]: [U] (*U) -> ::Array[U]
# Tries to convert `obj` into an array, using the `to_ary` method. Returns the
# converted array or `nil` if `obj` cannot be converted. This method can be used
# to check if an argument is an array.
#
# Array.try_convert([1]) #=> [1]
# Array.try_convert("1") #=> nil
#
# if tmp = Array.try_convert(arg)
# # the argument is an array
# elsif tmp = String.try_convert(arg)
# # the argument is a string
# end
#
def self.try_convert: [U] (untyped) -> ::Array[U]?
public
# Set Intersection --- Returns a new array containing unique elements common to
# the two arrays. The order is preserved from the original array.
#
# It compares elements using their #hash and #eql? methods for efficiency.
#
# [ 1, 1, 3, 5 ] & [ 3, 2, 1 ] #=> [ 1, 3 ]
# [ 'a', 'b', 'b', 'z' ] & [ 'a', 'b', 'c' ] #=> [ 'a', 'b' ]
#
# See also Array#uniq.
#
def &: (::Array[untyped] | _ToAry[untyped]) -> ::Array[Elem]
# Repetition --- With a String argument, equivalent to `ary.join(str)`.
#
# Otherwise, returns a new array built by concatenating the `int` copies of
# `self`.
#
# [ 1, 2, 3 ] * 3 #=> [ 1, 2, 3, 1, 2, 3, 1, 2, 3 ]
# [ 1, 2, 3 ] * "," #=> "1,2,3"
#
def *: (string str) -> ::String
| (int int) -> ::Array[Elem]
# Concatenation --- Returns a new array built by concatenating the two arrays
# together to produce a third array.
#
# [ 1, 2, 3 ] + [ 4, 5 ] #=> [ 1, 2, 3, 4, 5 ]
# a = [ "a", "b", "c" ]
# c = a + [ "d", "e", "f" ]
# c #=> [ "a", "b", "c", "d", "e", "f" ]
# a #=> [ "a", "b", "c" ]
#
# Note that
# x += y
#
# is the same as
# x = x + y
#
# This means that it produces a new array. As a consequence, repeated use of
# `+=` on arrays can be quite inefficient.
#
# See also Array#concat.
#
def +: [U] (_ToAry[U]) -> ::Array[Elem | U]
# Array Difference
#
# Returns a new array that is a copy of the original array, removing all
# occurrences of any item that also appear in `other_ary`. The order is
# preserved from the original array.
#
# It compares elements using their #hash and #eql? methods for efficiency.
#
# [ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ] #=> [ 3, 3, 5 ]
#
# Note that while 1 and 2 were only present once in the array argument, and were
# present twice in the receiver array, all occurrences of each Integer are
# removed in the returned array.
#
# If you need set-like behavior, see the library class Set.
#
# See also Array#difference.
#
def -: (_ToAry[untyped]) -> ::Array[Elem]
# Append---Pushes the given object on to the end of this array. This expression
# returns the array itself, so several appends may be chained together.
#
# a = [ 1, 2 ]
# a << "c" << "d" << [ 3, 4 ]
# #=> [ 1, 2, "c", "d", [ 3, 4 ] ]
# a
# #=> [ 1, 2, "c", "d", [ 3, 4 ] ]
#
def <<: (Elem) -> self
# Comparison --- Returns an integer (`-1`, `0`, or `+1`) if this array is less
# than, equal to, or greater than `other_ary`.
#
# Each object in each array is compared (using the <=> operator).
#
# Arrays are compared in an "element-wise" manner; the first element of `ary` is
# compared with the first one of `other_ary` using the <=> operator, then each
# of the second elements, etc... As soon as the result of any such comparison is
# non zero (i.e. the two corresponding elements are not equal), that result is
# returned for the whole array comparison.
#
# If all the elements are equal, then the result is based on a comparison of the
# array lengths. Thus, two arrays are "equal" according to Array#<=> if, and
# only if, they have the same length and the value of each element is equal to
# the value of the corresponding element in the other array.
#
# `nil` is returned if the `other_ary` is not an array or if the comparison of
# two elements returned `nil`.
#
# [ "a", "a", "c" ] <=> [ "a", "b", "c" ] #=> -1
# [ 1, 2, 3, 4, 5, 6 ] <=> [ 1, 2 ] #=> +1
# [ 1, 2 ] <=> [ 1, :two ] #=> nil
#
def <=>: (untyped) -> ::Integer?
# Equality --- Two arrays are equal if they contain the same number of elements
# and if each element is equal to (according to Object#==) the corresponding
# element in `other_ary`.
#
# [ "a", "c" ] == [ "a", "c", 7 ] #=> false
# [ "a", "c", 7 ] == [ "a", "c", 7 ] #=> true
# [ "a", "c", 7 ] == [ "a", "d", "f" ] #=> false
#
def ==: (untyped other) -> bool
# Element Reference --- Returns the element at `index`, or returns a subarray
# starting at the `start` index and continuing for `length` elements, or returns
# a subarray specified by `range` of indices.
#
# Negative indices count backward from the end of the array (-1 is the last
# element). For `start` and `range` cases the starting index is just before an
# element. Additionally, an empty array is returned when the starting index for
# an element range is at the end of the array.
#
# Returns `nil` if the index (or starting index) are out of range.
#
# a = [ "a", "b", "c", "d", "e" ]
# a[2] + a[0] + a[1] #=> "cab"
# a[6] #=> nil
# a[1, 2] #=> [ "b", "c" ]
# a[1..3] #=> [ "b", "c", "d" ]
# a[4..7] #=> [ "e" ]
# a[6..10] #=> nil
# a[-3, 3] #=> [ "c", "d", "e" ]
# # special cases
# a[5] #=> nil
# a[6, 1] #=> nil
# a[5, 1] #=> []
# a[5..10] #=> []
#
def []: (int index) -> Elem
| (int start, int length) -> ::Array[Elem]?
| (::Range[::Integer] range) -> ::Array[Elem]?
# Element Assignment --- Sets the element at `index`, or replaces a subarray
# from the `start` index for `length` elements, or replaces a subarray specified
# by the `range` of indices.
#
# If indices are greater than the current capacity of the array, the array grows
# automatically. Elements are inserted into the array at `start` if `length` is
# zero.
#
# Negative indices will count backward from the end of the array. For `start`
# and `range` cases the starting index is just before an element.
#
# An IndexError is raised if a negative index points past the beginning of the
# array.
#
# See also Array#push, and Array#unshift.
#
# a = Array.new
# a[4] = "4"; #=> [nil, nil, nil, nil, "4"]
# a[0, 3] = [ 'a', 'b', 'c' ] #=> ["a", "b", "c", nil, "4"]
# a[1..2] = [ 1, 2 ] #=> ["a", 1, 2, nil, "4"]
# a[0, 2] = "?" #=> ["?", 2, nil, "4"]
# a[0..2] = "A" #=> ["A", "4"]
# a[-1] = "Z" #=> ["A", "Z"]
# a[1..-1] = nil #=> ["A", nil]
# a[1..-1] = [] #=> ["A"]
# a[0, 0] = [ 1, 2 ] #=> [1, 2, "A"]
# a[3, 0] = "B" #=> [1, 2, "A", "B"]
#
def []=: (int index, Elem obj) -> Elem
| (int start, int length, Elem obj) -> Elem
| (int start, int length, ::Array[Elem]) -> ::Array[Elem]
| (int start, int length, nil) -> nil
| (::Range[::Integer], Elem obj) -> Elem
| (::Range[::Integer], ::Array[Elem]) -> ::Array[Elem]
| (::Range[::Integer], nil) -> nil
# See also Enumerable#all?
#
def all?: () -> bool
| (_Pattern[Elem] pattern) -> bool
| () { (Elem obj) -> boolish } -> bool
# See also Enumerable#any?
#
alias any? all?
alias append push
# Searches through an array whose elements are also arrays comparing `obj` with
# the first element of each contained array using `obj.==`.
#
# Returns the first contained array that matches (that is, the first associated
# array), or `nil` if no match is found.
#
# See also Array#rassoc
#
# s1 = [ "colors", "red", "blue", "green" ]
# s2 = [ "letters", "a", "b", "c" ]
# s3 = "foo"
# a = [ s1, s2, s3 ]
# a.assoc("letters") #=> [ "letters", "a", "b", "c" ]
# a.assoc("foo") #=> nil
#
def assoc: (untyped) -> ::Array[untyped]?
# Returns the element at `index`. A negative index counts from the end of
# `self`. Returns `nil` if the index is out of range. See also Array#[].
#
# a = [ "a", "b", "c", "d", "e" ]
# a.at(0) #=> "a"
# a.at(-1) #=> "e"
#
def at: (int index) -> Elem?
# By using binary search, finds a value from this array which meets the given
# condition in O(log n) where n is the size of the array.
#
# You can use this method in two modes: a find-minimum mode and a find-any mode.
# In either case, the elements of the array must be monotone (or sorted) with
# respect to the block.
#
# In find-minimum mode (this is a good choice for typical use cases), the block
# must always return true or false, and there must be an index i (0 <= i <=
# ary.size) so that:
#
# * the block returns false for any element whose index is less than i, and
# * the block returns true for any element whose index is greater than or
# equal to i.
#
#
# This method returns the i-th element. If i is equal to ary.size, it returns
# nil.
#
# ary = [0, 4, 7, 10, 12]
# ary.bsearch {|x| x >= 4 } #=> 4
# ary.bsearch {|x| x >= 6 } #=> 7
# ary.bsearch {|x| x >= -1 } #=> 0
# ary.bsearch {|x| x >= 100 } #=> nil
#
# In find-any mode (this behaves like libc's bsearch(3)), the block must always
# return a number, and there must be two indices i and j (0 <= i <= j <=
# ary.size) so that:
#
# * the block returns a positive number for [ary](k) if 0 <= k < i,
# * the block returns zero for [ary](k) if i <= k < j, and
# * the block returns a negative number for [ary](k) if j <= k < ary.size.
#
#
# Under this condition, this method returns any element whose index is within
# i...j. If i is equal to j (i.e., there is no element that satisfies the
# block), this method returns nil.
#
# ary = [0, 4, 7, 10, 12]
# # try to find v such that 4 <= v < 8
# ary.bsearch {|x| 1 - x / 4 } #=> 4 or 7
# # try to find v such that 8 <= v < 10
# ary.bsearch {|x| 4 - x / 2 } #=> nil
#
# You must not mix the two modes at a time; the block must always return either
# true/false, or always return a number. It is undefined which value is
# actually picked up at each iteration.
#
def bsearch: () { (Elem) -> (true | false) } -> Elem?
| () { (Elem) -> ::Integer } -> Elem?
# By using binary search, finds an index of a value from this array which meets
# the given condition in O(log n) where n is the size of the array.
#
# It supports two modes, depending on the nature of the block. They are exactly
# the same as in the case of the #bsearch method, with the only difference being
# that this method returns the index of the element instead of the element
# itself. For more details consult the documentation for #bsearch.
#
def bsearch_index: () { (Elem) -> (true | false) } -> ::Integer?
| () { (Elem) -> ::Integer } -> ::Integer?
# Removes all elements from `self`.
#
# a = [ "a", "b", "c", "d", "e" ]
# a.clear #=> [ ]
#
def clear: () -> self
# Invokes the given block once for each element of `self`.
#
# Creates a new array containing the values returned by the block.
#
# See also Enumerable#collect.
#
# If no block is given, an Enumerator is returned instead.
#
# a = [ "a", "b", "c", "d" ]
# a.collect {|x| x + "!"} #=> ["a!", "b!", "c!", "d!"]
# a.map.with_index {|x, i| x * i} #=> ["", "b", "cc", "ddd"]
# a #=> ["a", "b", "c", "d"]
#
def collect: [U] () { (Elem item) -> U } -> ::Array[U]
| () -> ::Enumerator[Elem, ::Array[untyped]]
# Invokes the given block once for each element of `self`, replacing the element
# with the value returned by the block.
#
# See also Enumerable#collect.
#
# If no block is given, an Enumerator is returned instead.
#
# a = [ "a", "b", "c", "d" ]
# a.map! {|x| x + "!" }
# a #=> [ "a!", "b!", "c!", "d!" ]
# a.collect!.with_index {|x, i| x[0...i] }
# a #=> ["", "b", "c!", "d!"]
#
# collect! is monomorphic because of RBS limitation.
def collect!: () { (Elem item) -> Elem } -> self
| () -> ::Enumerator[Elem, self]
# When invoked with a block, yields all combinations of length `n` of elements
# from the array and then returns the array itself.
#
# The implementation makes no guarantees about the order in which the
# combinations are yielded.
#
# If no block is given, an Enumerator is returned instead.
#
# Examples:
#
# a = [1, 2, 3, 4]
# a.combination(1).to_a #=> [[1],[2],[3],[4]]
# a.combination(2).to_a #=> [[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]
# a.combination(3).to_a #=> [[1,2,3],[1,2,4],[1,3,4],[2,3,4]]
# a.combination(4).to_a #=> [[1,2,3,4]]
# a.combination(0).to_a #=> [[]] # one combination of length 0
# a.combination(5).to_a #=> [] # no combinations of length 5
#
def combination: (int n) { (::Array[Elem]) -> void } -> self
| (int n) -> ::Enumerator[::Array[Elem], self]
# Returns a copy of `self` with all `nil` elements removed.
#
# [ "a", nil, "b", nil, "c", nil ].compact
# #=> [ "a", "b", "c" ]
#
def compact: () -> ::Array[Elem]
# Removes `nil` elements from the array.
#
# Returns `nil` if no changes were made, otherwise returns the array.
#
# [ "a", nil, "b", nil, "c" ].compact! #=> [ "a", "b", "c" ]
# [ "a", "b", "c" ].compact! #=> nil
#
def compact!: () -> self?
# Appends the elements of `other_ary`s to `self`.
#
# [ "a", "b" ].concat( ["c", "d"]) #=> [ "a", "b", "c", "d" ]
# [ "a" ].concat( ["b"], ["c", "d"]) #=> [ "a", "b", "c", "d" ]
# [ "a" ].concat #=> [ "a" ]
#
# a = [ 1, 2, 3 ]
# a.concat( [ 4, 5 ])
# a #=> [ 1, 2, 3, 4, 5 ]
#
# a = [ 1, 2 ]
# a.concat(a, a) #=> [1, 2, 1, 2, 1, 2]
#
# See also Array#+.
#
def concat: (*::Array[Elem] arrays) -> ::Array[Elem]
# Returns the number of elements.
#
# If an argument is given, counts the number of elements which equal `obj` using
# `==`.
#
# If a block is given, counts the number of elements for which the block returns
# a true value.
#
# ary = [1, 2, 4, 2]
# ary.count #=> 4
# ary.count(2) #=> 2
# ary.count {|x| x%2 == 0} #=> 3
#
def count: () -> ::Integer
| (untyped obj) -> ::Integer
| () { (Elem) -> boolish } -> ::Integer
# Calls the given block for each element `n` times or forever if `nil` is given.
#
# Does nothing if a non-positive number is given or the array is empty.
#
# Returns `nil` if the loop has finished without getting interrupted.
#
# If no block is given, an Enumerator is returned instead.
#
# a = ["a", "b", "c"]
# a.cycle {|x| puts x} # print, a, b, c, a, b, c,.. forever.
# a.cycle(2) {|x| puts x} # print, a, b, c, a, b, c.
#
def cycle: (?int? n) { (Elem) -> void } -> nil
| (?int? n) -> ::Enumerator[Elem, nil]
def deconstruct: () -> self
# Deletes all items from `self` that are equal to `obj`.
#
# Returns the last deleted item, or `nil` if no matching item is found.
#
# If the optional code block is given, the result of the block is returned if
# the item is not found. (To remove `nil` elements and get an informative
# return value, use Array#compact!)
#
# a = [ "a", "b", "b", "b", "c" ]
# a.delete("b") #=> "b"
# a #=> ["a", "c"]
# a.delete("z") #=> nil
# a.delete("z") {"not found"} #=> "not found"
#
def delete: (untyped obj) -> Elem?
| [S, T] (S obj) { (S) -> T } -> (Elem | T)
# Deletes the element at the specified `index`, returning that element, or `nil`
# if the `index` is out of range.
#
# See also Array#slice!
#
# a = ["ant", "bat", "cat", "dog"]
# a.delete_at(2) #=> "cat"
# a #=> ["ant", "bat", "dog"]
# a.delete_at(99) #=> nil
#
def delete_at: (int index) -> Elem?
# Deletes every element of `self` for which block evaluates to `true`.
#
# The array is changed instantly every time the block is called, not after the
# iteration is over.
#
# See also Array#reject!
#
# If no block is given, an Enumerator is returned instead.
#
# scores = [ 97, 42, 75 ]
# scores.delete_if {|score| score < 80 } #=> [97]
#
def delete_if: () { (Elem item) -> boolish } -> self
| () -> ::Enumerator[Elem, self]
# Array Difference
#
# Returns a new array that is a copy of the original array, removing all
# occurrences of any item that also appear in `other_ary`. The order is
# preserved from the original array.
#
# It compares elements using their #hash and #eql? methods for efficiency.
#
# [ 1, 1, 2, 2, 3, 3, 4, 5 ].difference([ 1, 2, 4 ]) #=> [ 3, 3, 5 ]
#
# Note that while 1 and 2 were only present once in the array argument, and were
# present twice in the receiver array, all occurrences of each Integer are
# removed in the returned array.
#
# Multiple array arguments can be supplied and all occurrences of any element in
# those supplied arrays that match the receiver will be removed from the
# returned array.
#
# [ 1, 'c', :s, 'yep' ].difference([ 1 ], [ 'a', 'c' ]) #=> [ :s, "yep" ]
#
# If you need set-like behavior, see the library class Set.
#
# See also Array#-.
#
def difference: (*::Array[untyped] arrays) -> ::Array[Elem]
# Extracts the nested value specified by the sequence of *idx* objects by
# calling `dig` at each step, returning `nil` if any intermediate step is `nil`.
#
# a = [[1, [2, 3]]]
#
# a.dig(0, 1, 1) #=> 3
# a.dig(1, 2, 3) #=> nil
# a.dig(0, 0, 0) #=> TypeError: Integer does not have #dig method
# [42, {foo: :bar}].dig(1, :foo) #=> :bar
#
def dig: (int idx) -> Elem?
| (int idx, untyped, *untyped) -> untyped
# Drops first `n` elements from `ary` and returns the rest of the elements in an
# array.
#
# If a negative number is given, raises an ArgumentError.
#
# See also Array#take
#
# a = [1, 2, 3, 4, 5, 0]
# a.drop(3) #=> [4, 5, 0]
#
def drop: (int n) -> ::Array[Elem]
# Drops elements up to, but not including, the first element for which the block
# returns `nil` or `false` and returns an array containing the remaining
# elements.
#
# If no block is given, an Enumerator is returned instead.
#
# See also Array#take_while
#
# a = [1, 2, 3, 4, 5, 0]
# a.drop_while {|i| i < 3 } #=> [3, 4, 5, 0]
#
def drop_while: () { (Elem obj) -> boolish } -> ::Array[Elem]
| () -> ::Enumerator[Elem, ::Array[Elem]]
# Calls the given block once for each element in `self`, passing that element as
# a parameter. Returns the array itself.
#
# If no block is given, an Enumerator is returned.
#
# a = [ "a", "b", "c" ]
# a.each {|x| print x, " -- " }
#
# produces:
#
# a -- b -- c --
#
def each: () -> ::Enumerator[Elem, self]
| () { (Elem item) -> void } -> self
# Same as Array#each, but passes the `index` of the element instead of the
# element itself.
#
# An Enumerator is returned if no block is given.
#
# a = [ "a", "b", "c" ]
# a.each_index {|x| print x, " -- " }
#
# produces:
#
# 0 -- 1 -- 2 --
#
def each_index: () { (::Integer index) -> void } -> self
| () -> ::Enumerator[Elem, self]
# Returns `true` if `self` contains no elements.
#
# [].empty? #=> true
#
def empty?: () -> bool
# Returns `true` if `self` and `other` are the same object, or are both arrays
# with the same content (according to Object#eql?).
#
def eql?: (untyped other) -> bool
# Tries to return the element at position `index`, but throws an IndexError
# exception if the referenced `index` lies outside of the array bounds. This
# error can be prevented by supplying a second argument, which will act as a
# `default` value.
#
# Alternatively, if a block is given it will only be executed when an invalid
# `index` is referenced.
#
# Negative values of `index` count from the end of the array.
#
# a = [ 11, 22, 33, 44 ]
# a.fetch(1) #=> 22
# a.fetch(-1) #=> 44
# a.fetch(4, 'cat') #=> "cat"
# a.fetch(100) {|i| puts "#{i} is out of bounds"}
# #=> "100 is out of bounds"
#
def fetch: (int index) -> Elem
| [T] (int index, T default) -> (Elem | T)
| [T] (int index) { (int index) -> T } -> (Elem | T)
# The first three forms set the selected elements of `self` (which may be the
# entire array) to `obj`.
#
# A `start` of `nil` is equivalent to zero.
#
# A `length` of `nil` is equivalent to the length of the array.
#
# The last three forms fill the array with the value of the given block, which
# is passed the absolute index of each element to be filled.
#
# Negative values of `start` count from the end of the array, where `-1` is the
# last element.
#
# a = [ "a", "b", "c", "d" ]
# a.fill("x") #=> ["x", "x", "x", "x"]
# a.fill("z", 2, 2) #=> ["x", "x", "z", "z"]
# a.fill("y", 0..1) #=> ["y", "y", "z", "z"]
# a.fill {|i| i*i} #=> [0, 1, 4, 9]
# a.fill(-2) {|i| i*i*i} #=> [0, 1, 8, 27]
#
def fill: (Elem obj) -> self
| (Elem obj, int? start, ?int? length) -> self
| (Elem obj, ::Range[::Integer] range) -> self
| (?int? start, ?int? length) { (::Integer index) -> Elem } -> self
| (::Range[::Integer] range) { (::Integer index) -> Elem } -> self
# Returns a new array containing all elements of `ary` for which the given
# `block` returns a true value.
#
# If no block is given, an Enumerator is returned instead.
#
# [1,2,3,4,5].select {|num| num.even? } #=> [2, 4]
#
# a = %w[ a b c d e f ]
# a.select {|v| v =~ /[aeiou]/ } #=> ["a", "e"]
#
# See also Enumerable#select.
#
# Array#filter is an alias for Array#select.
#
def filter: () { (Elem item) -> boolish } -> ::Array[Elem]
| () -> ::Enumerator[Elem, ::Array[Elem]]
# Invokes the given block passing in successive elements from `self`, deleting
# elements for which the block returns a `false` value.
#
# The array may not be changed instantly every time the block is called.
#
# If changes were made, it will return `self`, otherwise it returns `nil`.
#
# If no block is given, an Enumerator is returned instead.
#
# See also Array#keep_if.
#
# Array#filter! is an alias for Array#select!.
#
def filter!: () { (Elem item) -> boolish } -> self?
| () -> ::Enumerator[Elem, self?]
# Returns the *index* of the first object in `ary` such that the object is `==`
# to `obj`.
#
# If a block is given instead of an argument, returns the *index* of the first
# object for which the block returns `true`. Returns `nil` if no match is
# found.
#
# See also Array#rindex.
#
# An Enumerator is returned if neither a block nor argument is given.
#
# a = [ "a", "b", "c" ]
# a.index("b") #=> 1
# a.index("z") #=> nil
# a.index {|x| x == "b"} #=> 1
#
def find_index: (untyped obj) -> ::Integer?
| () { (Elem item) -> boolish } -> ::Integer?
| () -> ::Enumerator[Elem, ::Integer?]
# Returns the first element, or the first `n` elements, of the array. If the
# array is empty, the first form returns `nil`, and the second form returns an
# empty array. See also Array#last for the opposite effect.
#
# a = [ "q", "r", "s", "t" ]
# a.first #=> "q"
# a.first(2) #=> ["q", "r"]
#
def first: () -> Elem?
| (int n) -> ::Array[Elem]
# Returns a new array that is a one-dimensional flattening of `self`
# (recursively).
#
# That is, for every element that is an array, extract its elements into the new
# array.
#
# The optional `level` argument determines the level of recursion to flatten.
#
# s = [ 1, 2, 3 ] #=> [1, 2, 3]
# t = [ 4, 5, 6, [7, 8] ] #=> [4, 5, 6, [7, 8]]
# a = [ s, t, 9, 10 ] #=> [[1, 2, 3], [4, 5, 6, [7, 8]], 9, 10]
# a.flatten #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# a = [ 1, 2, [3, [4, 5] ] ]
# a.flatten(1) #=> [1, 2, 3, [4, 5]]
#
def flatten: (?int level) -> ::Array[untyped]
# Flattens `self` in place.
#