rbs 3.0.0.dev.2 → 3.0.0.dev.3
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.
- checksums.yaml +4 -4
- data/.github/workflows/comments.yml +2 -1
- data/.github/workflows/ruby.yml +4 -0
- data/Gemfile.lock +11 -11
- data/Rakefile +2 -2
- data/Steepfile +1 -1
- data/core/array.rbs +573 -423
- data/core/basic_object.rbs +11 -39
- data/core/binding.rbs +1 -1
- data/core/builtin.rbs +8 -0
- data/core/class.rbs +37 -0
- data/core/comparable.rbs +7 -18
- data/core/complex.rbs +2 -2
- data/core/data.rbs +419 -0
- data/core/dir.rbs +52 -104
- data/core/encoding.rbs +22 -181
- data/core/enumerable.rbs +212 -175
- data/core/enumerator/product.rbs +96 -0
- data/core/enumerator.rbs +57 -8
- data/core/errors.rbs +8 -2
- data/core/exception.rbs +41 -0
- data/core/fiber.rbs +95 -12
- data/core/file.rbs +840 -275
- data/core/file_test.rbs +34 -19
- data/core/float.rbs +40 -96
- data/core/gc.rbs +15 -3
- data/core/hash.rbs +113 -175
- data/core/integer.rbs +85 -145
- data/core/io/buffer.rbs +187 -60
- data/core/io/wait.rbs +28 -16
- data/core/io.rbs +1859 -1389
- data/core/kernel.rbs +525 -961
- data/core/match_data.rbs +306 -142
- data/core/math.rbs +506 -234
- data/core/method.rbs +0 -24
- data/core/module.rbs +110 -17
- data/core/nil_class.rbs +2 -0
- data/core/numeric.rbs +76 -144
- data/core/object.rbs +88 -212
- data/core/proc.rbs +17 -5
- data/core/process.rbs +22 -5
- data/core/ractor.rbs +1 -1
- data/core/random.rbs +20 -3
- data/core/range.rbs +91 -89
- data/core/rational.rbs +2 -3
- data/core/rbs/unnamed/argf.rbs +177 -120
- data/core/rbs/unnamed/env_class.rbs +89 -163
- data/core/rbs/unnamed/random.rbs +36 -12
- data/core/refinement.rbs +8 -0
- data/core/regexp.rbs +462 -272
- data/core/ruby_vm.rbs +210 -0
- data/{stdlib/set/0 → core}/set.rbs +43 -47
- data/core/string.rbs +1403 -1332
- data/core/string_io.rbs +191 -107
- data/core/struct.rbs +67 -63
- data/core/symbol.rbs +187 -201
- data/core/thread.rbs +40 -35
- data/core/time.rbs +902 -826
- data/core/trace_point.rbs +55 -6
- data/core/unbound_method.rbs +48 -24
- data/docs/collection.md +4 -0
- data/docs/syntax.md +55 -0
- data/ext/rbs_extension/parser.c +5 -6
- data/lib/rbs/cli.rb +6 -1
- data/lib/rbs/collection/cleaner.rb +8 -1
- data/lib/rbs/collection/config/lockfile.rb +3 -1
- data/lib/rbs/collection/config/lockfile_generator.rb +16 -14
- data/lib/rbs/collection/config.rb +1 -1
- data/lib/rbs/collection/sources/git.rb +9 -2
- data/lib/rbs/collection/sources/local.rb +79 -0
- data/lib/rbs/collection/sources.rb +8 -1
- data/lib/rbs/environment.rb +6 -5
- data/lib/rbs/environment_loader.rb +3 -2
- data/lib/rbs/errors.rb +18 -0
- data/lib/rbs/locator.rb +26 -7
- data/lib/rbs/sorter.rb +2 -2
- data/lib/rbs/version.rb +1 -1
- data/sig/collection/sources.rbs +32 -3
- data/sig/environment.rbs +2 -3
- data/sig/locator.rbs +14 -2
- data/sig/shims/{abstract_syntax_tree.rbs → _abstract_syntax_tree.rbs} +0 -0
- data/stdlib/bigdecimal/0/big_decimal.rbs +16 -13
- data/stdlib/cgi/0/core.rbs +16 -0
- data/stdlib/coverage/0/coverage.rbs +50 -8
- data/stdlib/csv/0/csv.rbs +1 -1
- data/stdlib/date/0/date.rbs +856 -726
- data/stdlib/date/0/date_time.rbs +83 -210
- data/stdlib/erb/0/erb.rbs +13 -36
- data/stdlib/etc/0/etc.rbs +127 -20
- data/stdlib/fileutils/0/fileutils.rbs +1290 -381
- data/stdlib/logger/0/logger.rbs +466 -316
- data/stdlib/net-http/0/net-http.rbs +2211 -534
- data/stdlib/nkf/0/nkf.rbs +5 -5
- data/stdlib/objspace/0/objspace.rbs +31 -14
- data/stdlib/openssl/0/openssl.rbs +11 -7
- data/stdlib/optparse/0/optparse.rbs +20 -17
- data/stdlib/pathname/0/pathname.rbs +21 -4
- data/stdlib/pstore/0/pstore.rbs +378 -154
- data/stdlib/pty/0/pty.rbs +24 -8
- data/stdlib/ripper/0/ripper.rbs +1650 -0
- data/stdlib/socket/0/addrinfo.rbs +9 -15
- data/stdlib/socket/0/socket.rbs +36 -3
- data/stdlib/strscan/0/string_scanner.rbs +7 -5
- data/stdlib/tempfile/0/tempfile.rbs +104 -44
- data/stdlib/time/0/time.rbs +2 -2
- data/stdlib/uri/0/file.rbs +5 -0
- data/stdlib/uri/0/generic.rbs +2 -2
- data/stdlib/yaml/0/yaml.rbs +2 -2
- data/stdlib/zlib/0/zlib.rbs +1 -1
- metadata +8 -6
- data/core/deprecated.rbs +0 -9
- data/sig/shims/ripper.rbs +0 -8
data/core/enumerable.rbs
CHANGED
|
@@ -2,12 +2,13 @@
|
|
|
2
2
|
# ## What's Here
|
|
3
3
|
#
|
|
4
4
|
# Module Enumerable provides methods that are useful to a collection class for:
|
|
5
|
-
#
|
|
6
|
-
# * [
|
|
7
|
-
# * [
|
|
8
|
-
# * [
|
|
9
|
-
# * [
|
|
10
|
-
# * [
|
|
5
|
+
#
|
|
6
|
+
# * [Querying](rdoc-ref:Enumerable@Methods+for+Querying)
|
|
7
|
+
# * [Fetching](rdoc-ref:Enumerable@Methods+for+Fetching)
|
|
8
|
+
# * [Searching](rdoc-ref:Enumerable@Methods+for+Searching)
|
|
9
|
+
# * [Sorting](rdoc-ref:Enumerable@Methods+for+Sorting)
|
|
10
|
+
# * [Iterating](rdoc-ref:Enumerable@Methods+for+Iterating)
|
|
11
|
+
# * [And more....](rdoc-ref:Enumerable@Other+Methods)
|
|
11
12
|
#
|
|
12
13
|
#
|
|
13
14
|
# ### Methods for Querying
|
|
@@ -15,25 +16,20 @@
|
|
|
15
16
|
# These methods return information about the Enumerable other than the elements
|
|
16
17
|
# themselves:
|
|
17
18
|
#
|
|
18
|
-
# #include?, #member
|
|
19
|
-
# : Returns `true` if self == object, `false` otherwise.
|
|
20
|
-
# #all?
|
|
21
|
-
# : Returns `true` if all elements meet a specified criterion; `false`
|
|
19
|
+
# * #include?, #member?: Returns `true` if `self == object`, `false`
|
|
22
20
|
# otherwise.
|
|
23
|
-
# #
|
|
24
|
-
# : Returns `true` if any element meets a specified criterion; `false`
|
|
21
|
+
# * #all?: Returns `true` if all elements meet a specified criterion; `false`
|
|
25
22
|
# otherwise.
|
|
26
|
-
# #
|
|
27
|
-
# : Returns `true` if no element meets a specified criterion; `false`
|
|
23
|
+
# * #any?: Returns `true` if any element meets a specified criterion; `false`
|
|
28
24
|
# otherwise.
|
|
29
|
-
# #
|
|
30
|
-
# : Returns `true` if exactly one element meets a specified criterion; `false`
|
|
25
|
+
# * #none?: Returns `true` if no element meets a specified criterion; `false`
|
|
31
26
|
# otherwise.
|
|
32
|
-
# #
|
|
33
|
-
#
|
|
34
|
-
#
|
|
35
|
-
#
|
|
36
|
-
# :
|
|
27
|
+
# * #one?: Returns `true` if exactly one element meets a specified criterion;
|
|
28
|
+
# `false` otherwise.
|
|
29
|
+
# * #count: Returns the count of elements, based on an argument or block
|
|
30
|
+
# criterion, if given.
|
|
31
|
+
# * #tally: Returns a new Hash containing the counts of occurrences of each
|
|
32
|
+
# element.
|
|
37
33
|
#
|
|
38
34
|
#
|
|
39
35
|
# ### Methods for Fetching
|
|
@@ -41,126 +37,96 @@
|
|
|
41
37
|
# These methods return entries from the Enumerable, without modifying it:
|
|
42
38
|
#
|
|
43
39
|
# *Leading, trailing, or all elements*:
|
|
44
|
-
#
|
|
45
|
-
# :
|
|
46
|
-
# #first
|
|
47
|
-
# :
|
|
48
|
-
# #
|
|
49
|
-
# :
|
|
50
|
-
# #
|
|
51
|
-
# : Returns a specified number of trailing elements.
|
|
52
|
-
# #take_while
|
|
53
|
-
# : Returns leading elements as specified by the given block.
|
|
54
|
-
# #drop_while
|
|
55
|
-
# : Returns trailing elements as specified by the given block.
|
|
40
|
+
#
|
|
41
|
+
# * #entries, #to_a: Returns all elements.
|
|
42
|
+
# * #first: Returns the first element or leading elements.
|
|
43
|
+
# * #take: Returns a specified number of leading elements.
|
|
44
|
+
# * #drop: Returns a specified number of trailing elements.
|
|
45
|
+
# * #take_while: Returns leading elements as specified by the given block.
|
|
46
|
+
# * #drop_while: Returns trailing elements as specified by the given block.
|
|
56
47
|
#
|
|
57
48
|
#
|
|
58
49
|
# *Minimum and maximum value elements*:
|
|
59
|
-
#
|
|
60
|
-
# :
|
|
61
|
-
# determined by `<=>` or a given block.
|
|
62
|
-
# #max
|
|
63
|
-
# : Returns the elements whose values are largest among the elements, as
|
|
50
|
+
#
|
|
51
|
+
# * #min: Returns the elements whose values are smallest among the elements,
|
|
52
|
+
# as determined by `<=>` or a given block.
|
|
53
|
+
# * #max: Returns the elements whose values are largest among the elements, as
|
|
64
54
|
# determined by `<=>` or a given block.
|
|
65
|
-
# #minmax
|
|
66
|
-
#
|
|
67
|
-
# #min_by
|
|
68
|
-
# :
|
|
69
|
-
# #
|
|
70
|
-
#
|
|
71
|
-
# #minmax_by
|
|
72
|
-
# : Returns the smallest and largest elements, as determined by the given
|
|
73
|
-
# block.
|
|
55
|
+
# * #minmax: Returns a 2-element Array containing the smallest and largest
|
|
56
|
+
# elements.
|
|
57
|
+
# * #min_by: Returns the smallest element, as determined by the given block.
|
|
58
|
+
# * #max_by: Returns the largest element, as determined by the given block.
|
|
59
|
+
# * #minmax_by: Returns the smallest and largest elements, as determined by
|
|
60
|
+
# the given block.
|
|
74
61
|
#
|
|
75
62
|
#
|
|
76
63
|
# *Groups, slices, and partitions*:
|
|
77
|
-
#
|
|
78
|
-
# :
|
|
79
|
-
# #partition
|
|
80
|
-
#
|
|
64
|
+
#
|
|
65
|
+
# * #group_by: Returns a Hash that partitions the elements into groups.
|
|
66
|
+
# * #partition: Returns elements partitioned into two new Arrays, as
|
|
67
|
+
# determined by the given block.
|
|
68
|
+
# * #slice_after: Returns a new Enumerator whose entries are a partition of
|
|
69
|
+
# `self`, based either on a given `object` or a given block.
|
|
70
|
+
# * #slice_before: Returns a new Enumerator whose entries are a partition of
|
|
71
|
+
# `self`, based either on a given `object` or a given block.
|
|
72
|
+
# * #slice_when: Returns a new Enumerator whose entries are a partition of
|
|
73
|
+
# `self` based on the given block.
|
|
74
|
+
# * #chunk: Returns elements organized into chunks as specified by the given
|
|
75
|
+
# block.
|
|
76
|
+
# * #chunk_while: Returns elements organized into chunks as specified by the
|
|
81
77
|
# given block.
|
|
82
|
-
# #slice_after
|
|
83
|
-
# : Returns a new Enumerator whose entries are a partition of `self`, based
|
|
84
|
-
# either on a given `object` or a given block.
|
|
85
|
-
# #slice_before
|
|
86
|
-
# : Returns a new Enumerator whose entries are a partition of `self`, based
|
|
87
|
-
# either on a given `object` or a given block.
|
|
88
|
-
# #slice_when
|
|
89
|
-
# : Returns a new Enumerator whose entries are a partition of `self` based on
|
|
90
|
-
# the given block.
|
|
91
|
-
# #chunk
|
|
92
|
-
# : Returns elements organized into chunks as specified by the given block.
|
|
93
|
-
# #chunk_while
|
|
94
|
-
# : Returns elements organized into chunks as specified by the given block.
|
|
95
78
|
#
|
|
96
79
|
#
|
|
97
80
|
# ### Methods for Searching and Filtering
|
|
98
81
|
#
|
|
99
|
-
# These methods return elements that meet a specified criterion
|
|
82
|
+
# These methods return elements that meet a specified criterion:
|
|
100
83
|
#
|
|
101
|
-
# #find, #detect
|
|
102
|
-
# :
|
|
103
|
-
# #
|
|
104
|
-
#
|
|
105
|
-
# #
|
|
106
|
-
# :
|
|
107
|
-
# #reject
|
|
108
|
-
# : Returns elements not rejected by the block.
|
|
109
|
-
# #uniq
|
|
110
|
-
# : Returns elements that are not duplicates.
|
|
84
|
+
# * #find, #detect: Returns an element selected by the block.
|
|
85
|
+
# * #find_all, #filter, #select: Returns elements selected by the block.
|
|
86
|
+
# * #find_index: Returns the index of an element selected by a given object or
|
|
87
|
+
# block.
|
|
88
|
+
# * #reject: Returns elements not rejected by the block.
|
|
89
|
+
# * #uniq: Returns elements that are not duplicates.
|
|
111
90
|
#
|
|
112
91
|
#
|
|
113
92
|
# ### Methods for Sorting
|
|
114
93
|
#
|
|
115
|
-
# These methods return elements in sorted order
|
|
94
|
+
# These methods return elements in sorted order:
|
|
116
95
|
#
|
|
117
|
-
# #sort
|
|
118
|
-
# :
|
|
119
|
-
# #sort_by
|
|
120
|
-
# : Returns the elements, sorted by the given block.
|
|
96
|
+
# * #sort: Returns the elements, sorted by `<=>` or the given block.
|
|
97
|
+
# * #sort_by: Returns the elements, sorted by the given block.
|
|
121
98
|
#
|
|
122
99
|
#
|
|
123
100
|
# ### Methods for Iterating
|
|
124
101
|
#
|
|
125
|
-
# #each_entry
|
|
126
|
-
#
|
|
127
|
-
#
|
|
128
|
-
#
|
|
129
|
-
# :
|
|
130
|
-
#
|
|
131
|
-
# :
|
|
132
|
-
# #
|
|
133
|
-
#
|
|
134
|
-
# #
|
|
135
|
-
#
|
|
136
|
-
# #each_slice).
|
|
137
|
-
# #reverse_each
|
|
138
|
-
# : Calls the block with each successive element, in reverse order.
|
|
102
|
+
# * #each_entry: Calls the block with each successive element (slightly
|
|
103
|
+
# different from #each).
|
|
104
|
+
# * #each_with_index: Calls the block with each successive element and its
|
|
105
|
+
# index.
|
|
106
|
+
# * #each_with_object: Calls the block with each successive element and a
|
|
107
|
+
# given object.
|
|
108
|
+
# * #each_slice: Calls the block with successive non-overlapping slices.
|
|
109
|
+
# * #each_cons: Calls the block with successive overlapping slices. (different
|
|
110
|
+
# from #each_slice).
|
|
111
|
+
# * #reverse_each: Calls the block with each successive element, in reverse
|
|
112
|
+
# order.
|
|
139
113
|
#
|
|
140
114
|
#
|
|
141
115
|
# ### Other Methods
|
|
142
116
|
#
|
|
143
|
-
# #map, #collect
|
|
144
|
-
# :
|
|
145
|
-
# #
|
|
146
|
-
# : Returns truthy objects returned by the block.
|
|
147
|
-
# #flat_map, #collect_concat
|
|
148
|
-
# : Returns flattened objects returned by the block.
|
|
149
|
-
# #grep
|
|
150
|
-
# : Returns elements selected by a given object or objects returned by a given
|
|
151
|
-
# block.
|
|
152
|
-
# #grep_v
|
|
153
|
-
# : Returns elements selected by a given object or objects returned by a given
|
|
117
|
+
# * #map, #collect: Returns objects returned by the block.
|
|
118
|
+
# * #filter_map: Returns truthy objects returned by the block.
|
|
119
|
+
# * #flat_map, #collect_concat: Returns flattened objects returned by the
|
|
154
120
|
# block.
|
|
155
|
-
# #
|
|
156
|
-
#
|
|
157
|
-
# #
|
|
158
|
-
#
|
|
159
|
-
# #
|
|
160
|
-
# :
|
|
161
|
-
#
|
|
162
|
-
#
|
|
163
|
-
# :
|
|
121
|
+
# * #grep: Returns elements selected by a given object or objects returned by
|
|
122
|
+
# a given block.
|
|
123
|
+
# * #grep_v: Returns elements selected by a given object or objects returned
|
|
124
|
+
# by a given block.
|
|
125
|
+
# * #reduce, #inject: Returns the object formed by combining all elements.
|
|
126
|
+
# * #sum: Returns the sum of the elements, using method `+`.
|
|
127
|
+
# * #zip: Combines each element with elements from other enumerables; returns
|
|
128
|
+
# the n-tuples or calls the block with each.
|
|
129
|
+
# * #cycle: Calls the block with each element, cycling repeatedly.
|
|
164
130
|
#
|
|
165
131
|
#
|
|
166
132
|
# ## Usage
|
|
@@ -193,18 +159,32 @@
|
|
|
193
159
|
# [1, 2]
|
|
194
160
|
# nil
|
|
195
161
|
#
|
|
196
|
-
# ## Enumerable in Ruby
|
|
197
|
-
#
|
|
162
|
+
# ## Enumerable in Ruby Classes
|
|
163
|
+
#
|
|
164
|
+
# These Ruby core classes include (or extend) Enumerable:
|
|
165
|
+
#
|
|
166
|
+
# * ARGF
|
|
198
167
|
# * Array
|
|
199
168
|
# * Dir
|
|
169
|
+
# * Enumerator
|
|
170
|
+
# * ENV (extends)
|
|
200
171
|
# * Hash
|
|
201
172
|
# * IO
|
|
202
173
|
# * Range
|
|
203
|
-
# * Set
|
|
204
174
|
# * Struct
|
|
205
175
|
#
|
|
176
|
+
#
|
|
177
|
+
# These Ruby standard library classes include Enumerable:
|
|
178
|
+
#
|
|
179
|
+
# * CSV
|
|
180
|
+
# * CSV::Table
|
|
181
|
+
# * CSV::Row
|
|
182
|
+
# * Set
|
|
183
|
+
#
|
|
184
|
+
#
|
|
206
185
|
# Virtually all methods in Enumerable call method `#each` in the including
|
|
207
186
|
# class:
|
|
187
|
+
#
|
|
208
188
|
# * `Hash#each` yields the next key-value pair as a 2-element Array.
|
|
209
189
|
# * `Struct#each` yields the next name-value pair as a 2-element Array.
|
|
210
190
|
# * For the other classes above, `#each` yields the next object from the
|
|
@@ -212,7 +192,9 @@
|
|
|
212
192
|
#
|
|
213
193
|
#
|
|
214
194
|
# ## About the Examples
|
|
195
|
+
#
|
|
215
196
|
# The example code snippets for the Enumerable methods:
|
|
197
|
+
#
|
|
216
198
|
# * Always show the use of one or more Array-like classes (often Array
|
|
217
199
|
# itself).
|
|
218
200
|
# * Sometimes show the use of a Hash-like class. For some methods, though, the
|
|
@@ -523,8 +505,10 @@ module Enumerable[unchecked out Elem] : _Each[Elem]
|
|
|
523
505
|
# Calls the block once for each element, passing both the element and the given
|
|
524
506
|
# object:
|
|
525
507
|
#
|
|
526
|
-
# (1..4).each_with_object([]) {|i, a| a.push(i**2) }
|
|
527
|
-
#
|
|
508
|
+
# (1..4).each_with_object([]) {|i, a| a.push(i**2) }
|
|
509
|
+
# # => [1, 4, 9, 16]
|
|
510
|
+
#
|
|
511
|
+
# {foo: 0, bar: 1, baz: 2}.each_with_object({}) {|(k, v), h| h[v] = k }
|
|
528
512
|
# # => {0=>:foo, 1=>:bar, 2=>:baz}
|
|
529
513
|
#
|
|
530
514
|
# With no block given, returns an Enumerator.
|
|
@@ -1998,8 +1982,10 @@ module Enumerable[unchecked out Elem] : _Each[Elem]
|
|
|
1998
1982
|
# [:a2, :b2, :c2]
|
|
1999
1983
|
# [:a3, :b3, :c3]
|
|
2000
1984
|
#
|
|
2001
|
-
def zip: [Elem2] (
|
|
2002
|
-
| [
|
|
1985
|
+
def zip: [Elem2] (_Each[Elem2] enum) -> Array[[ Elem, Elem2? ]]
|
|
1986
|
+
| (_Each[untyped], *_Each[untyped]) -> Array[Array[untyped]]
|
|
1987
|
+
| [Elem2] (_Each[Elem2]) { ([ Elem, Elem2? ]) -> void } -> nil
|
|
1988
|
+
| (_Each[untyped], *_Each[untyped]) { (Array[untyped]) -> void } -> nil
|
|
2003
1989
|
|
|
2004
1990
|
# <!--
|
|
2005
1991
|
# rdoc-file=enum.c
|
|
@@ -2112,83 +2098,134 @@ module Enumerable[unchecked out Elem] : _Each[Elem]
|
|
|
2112
2098
|
|
|
2113
2099
|
# <!--
|
|
2114
2100
|
# rdoc-file=enum.c
|
|
2115
|
-
# - chunk_while {|
|
|
2101
|
+
# - enum.chunk_while {|elt_before, elt_after| bool } -> an_enumerator
|
|
2116
2102
|
# -->
|
|
2117
|
-
#
|
|
2118
|
-
#
|
|
2119
|
-
# new chunk if and only if the block returns a truthy value:
|
|
2103
|
+
# Creates an enumerator for each chunked elements. The beginnings of chunks are
|
|
2104
|
+
# defined by the block.
|
|
2120
2105
|
#
|
|
2121
|
-
#
|
|
2106
|
+
# This method splits each chunk using adjacent elements, *elt_before* and
|
|
2107
|
+
# *elt_after*, in the receiver enumerator. This method split chunks between
|
|
2108
|
+
# *elt_before* and *elt_after* where the block returns `false`.
|
|
2122
2109
|
#
|
|
2123
|
-
#
|
|
2124
|
-
# e = a.chunk_while {|i, j| j == i + 1 }
|
|
2125
|
-
# e.each {|array| p array }
|
|
2110
|
+
# The block is called the length of the receiver enumerator minus one.
|
|
2126
2111
|
#
|
|
2127
|
-
#
|
|
2112
|
+
# The result enumerator yields the chunked elements as an array. So `each`
|
|
2113
|
+
# method can be called as follows:
|
|
2128
2114
|
#
|
|
2129
|
-
#
|
|
2130
|
-
#
|
|
2131
|
-
#
|
|
2132
|
-
#
|
|
2133
|
-
#
|
|
2115
|
+
# enum.chunk_while { |elt_before, elt_after| bool }.each { |ary| ... }
|
|
2116
|
+
#
|
|
2117
|
+
# Other methods of the Enumerator class and Enumerable module, such as `to_a`,
|
|
2118
|
+
# `map`, etc., are also usable.
|
|
2119
|
+
#
|
|
2120
|
+
# For example, one-by-one increasing subsequence can be chunked as follows:
|
|
2121
|
+
#
|
|
2122
|
+
# a = [1,2,4,9,10,11,12,15,16,19,20,21]
|
|
2123
|
+
# b = a.chunk_while {|i, j| i+1 == j }
|
|
2124
|
+
# p b.to_a #=> [[1, 2], [4], [9, 10, 11, 12], [15, 16], [19, 20, 21]]
|
|
2125
|
+
# c = b.map {|a| a.length < 3 ? a : "#{a.first}-#{a.last}" }
|
|
2126
|
+
# p c #=> [[1, 2], [4], "9-12", [15, 16], "19-21"]
|
|
2127
|
+
# d = c.join(",")
|
|
2128
|
+
# p d #=> "1,2,4,9-12,15,16,19-21"
|
|
2129
|
+
#
|
|
2130
|
+
# Increasing (non-decreasing) subsequence can be chunked as follows:
|
|
2131
|
+
#
|
|
2132
|
+
# a = [0, 9, 2, 2, 3, 2, 7, 5, 9, 5]
|
|
2133
|
+
# p a.chunk_while {|i, j| i <= j }.to_a
|
|
2134
|
+
# #=> [[0, 9], [2, 2, 3], [2, 7], [5, 9], [5]]
|
|
2135
|
+
#
|
|
2136
|
+
# Adjacent evens and odds can be chunked as follows: (Enumerable#chunk is
|
|
2137
|
+
# another way to do it.)
|
|
2138
|
+
#
|
|
2139
|
+
# a = [7, 5, 9, 2, 0, 7, 9, 4, 2, 0]
|
|
2140
|
+
# p a.chunk_while {|i, j| i.even? == j.even? }.to_a
|
|
2141
|
+
# #=> [[7, 5, 9], [2, 0], [7, 9], [4, 2, 0]]
|
|
2142
|
+
#
|
|
2143
|
+
# Enumerable#slice_when does the same, except splitting when the block returns
|
|
2144
|
+
# `true` instead of `false`.
|
|
2134
2145
|
#
|
|
2135
2146
|
def chunk_while: () { (Elem elt_before, Elem elt_after) -> boolish } -> ::Enumerator[::Array[Elem], void]
|
|
2136
2147
|
|
|
2137
2148
|
# <!--
|
|
2138
2149
|
# rdoc-file=enum.c
|
|
2139
|
-
# - slice_when {|
|
|
2150
|
+
# - enum.slice_when {|elt_before, elt_after| bool } -> an_enumerator
|
|
2140
2151
|
# -->
|
|
2141
|
-
#
|
|
2142
|
-
#
|
|
2143
|
-
# new slice if and only if the block returns a truthy value:
|
|
2152
|
+
# Creates an enumerator for each chunked elements. The beginnings of chunks are
|
|
2153
|
+
# defined by the block.
|
|
2144
2154
|
#
|
|
2145
|
-
#
|
|
2146
|
-
#
|
|
2147
|
-
#
|
|
2155
|
+
# This method splits each chunk using adjacent elements, *elt_before* and
|
|
2156
|
+
# *elt_after*, in the receiver enumerator. This method split chunks between
|
|
2157
|
+
# *elt_before* and *elt_after* where the block returns `true`.
|
|
2148
2158
|
#
|
|
2149
|
-
#
|
|
2159
|
+
# The block is called the length of the receiver enumerator minus one.
|
|
2160
|
+
#
|
|
2161
|
+
# The result enumerator yields the chunked elements as an array. So `each`
|
|
2162
|
+
# method can be called as follows:
|
|
2163
|
+
#
|
|
2164
|
+
# enum.slice_when { |elt_before, elt_after| bool }.each { |ary| ... }
|
|
2165
|
+
#
|
|
2166
|
+
# Other methods of the Enumerator class and Enumerable module, such as `to_a`,
|
|
2167
|
+
# `map`, etc., are also usable.
|
|
2168
|
+
#
|
|
2169
|
+
# For example, one-by-one increasing subsequence can be chunked as follows:
|
|
2170
|
+
#
|
|
2171
|
+
# a = [1,2,4,9,10,11,12,15,16,19,20,21]
|
|
2172
|
+
# b = a.slice_when {|i, j| i+1 != j }
|
|
2173
|
+
# p b.to_a #=> [[1, 2], [4], [9, 10, 11, 12], [15, 16], [19, 20, 21]]
|
|
2174
|
+
# c = b.map {|a| a.length < 3 ? a : "#{a.first}-#{a.last}" }
|
|
2175
|
+
# p c #=> [[1, 2], [4], "9-12", [15, 16], "19-21"]
|
|
2176
|
+
# d = c.join(",")
|
|
2177
|
+
# p d #=> "1,2,4,9-12,15,16,19-21"
|
|
2178
|
+
#
|
|
2179
|
+
# Near elements (threshold: 6) in sorted array can be chunked as follows:
|
|
2180
|
+
#
|
|
2181
|
+
# a = [3, 11, 14, 25, 28, 29, 29, 41, 55, 57]
|
|
2182
|
+
# p a.slice_when {|i, j| 6 < j - i }.to_a
|
|
2183
|
+
# #=> [[3], [11, 14], [25, 28, 29, 29], [41], [55, 57]]
|
|
2184
|
+
#
|
|
2185
|
+
# Increasing (non-decreasing) subsequence can be chunked as follows:
|
|
2186
|
+
#
|
|
2187
|
+
# a = [0, 9, 2, 2, 3, 2, 7, 5, 9, 5]
|
|
2188
|
+
# p a.slice_when {|i, j| i > j }.to_a
|
|
2189
|
+
# #=> [[0, 9], [2, 2, 3], [2, 7], [5, 9], [5]]
|
|
2150
2190
|
#
|
|
2151
|
-
#
|
|
2152
|
-
#
|
|
2153
|
-
#
|
|
2191
|
+
# Adjacent evens and odds can be chunked as follows: (Enumerable#chunk is
|
|
2192
|
+
# another way to do it.)
|
|
2193
|
+
#
|
|
2194
|
+
# a = [7, 5, 9, 2, 0, 7, 9, 4, 2, 0]
|
|
2195
|
+
# p a.slice_when {|i, j| i.even? != j.even? }.to_a
|
|
2196
|
+
# #=> [[7, 5, 9], [2, 0], [7, 9], [4, 2, 0]]
|
|
2197
|
+
#
|
|
2198
|
+
# Paragraphs (non-empty lines with trailing empty lines) can be chunked as
|
|
2199
|
+
# follows: (See Enumerable#chunk to ignore empty lines.)
|
|
2200
|
+
#
|
|
2201
|
+
# lines = ["foo\n", "bar\n", "\n", "baz\n", "qux\n"]
|
|
2202
|
+
# p lines.slice_when {|l1, l2| /\A\s*\z/ =~ l1 && /\S/ =~ l2 }.to_a
|
|
2203
|
+
# #=> [["foo\n", "bar\n", "\n"], ["baz\n", "qux\n"]]
|
|
2204
|
+
#
|
|
2205
|
+
# Enumerable#chunk_while does the same, except splitting when the block returns
|
|
2206
|
+
# `false` instead of `true`.
|
|
2154
2207
|
#
|
|
2155
2208
|
def slice_when: () { (Elem elt_before, Elem elt_after) -> boolish } -> ::Enumerator[::Array[Elem], void]
|
|
2156
2209
|
|
|
2157
2210
|
# <!--
|
|
2158
2211
|
# rdoc-file=enum.c
|
|
2159
|
-
# - slice_after(pattern) ->
|
|
2160
|
-
# - slice_after {|
|
|
2212
|
+
# - enum.slice_after(pattern) -> an_enumerator
|
|
2213
|
+
# - enum.slice_after { |elt| bool } -> an_enumerator
|
|
2161
2214
|
# -->
|
|
2162
|
-
#
|
|
2163
|
-
#
|
|
2164
|
-
# if `element === pattern`:
|
|
2165
|
-
#
|
|
2166
|
-
# a = %w[foo bar fop for baz fob fog bam foy]
|
|
2167
|
-
# e = a.slice_after(/ba/) # => #<Enumerator: ...>
|
|
2168
|
-
# e.each {|array| p array }
|
|
2215
|
+
# Creates an enumerator for each chunked elements. The ends of chunks are
|
|
2216
|
+
# defined by *pattern* and the block.
|
|
2169
2217
|
#
|
|
2170
|
-
#
|
|
2171
|
-
#
|
|
2172
|
-
# ["foo", "bar"]
|
|
2173
|
-
# ["fop", "for", "baz"]
|
|
2174
|
-
# ["fob", "fog", "bam"]
|
|
2175
|
-
# ["foy"]
|
|
2176
|
-
#
|
|
2177
|
-
# With a block, returns an enumerator that uses the block to partition elements
|
|
2178
|
-
# into arrays. An element ends the current slice if its block return is a truthy
|
|
2179
|
-
# value:
|
|
2218
|
+
# If *`pattern* === *elt`* returns `true` or the block returns `true` for the
|
|
2219
|
+
# element, the element is end of a chunk.
|
|
2180
2220
|
#
|
|
2181
|
-
#
|
|
2182
|
-
#
|
|
2221
|
+
# The `===` and *block* is called from the first element to the last element of
|
|
2222
|
+
# *enum*.
|
|
2183
2223
|
#
|
|
2184
|
-
#
|
|
2224
|
+
# The result enumerator yields the chunked elements as an array. So `each`
|
|
2225
|
+
# method can be called as follows:
|
|
2185
2226
|
#
|
|
2186
|
-
#
|
|
2187
|
-
#
|
|
2188
|
-
# [7, 8, 9, 10]
|
|
2189
|
-
# [11, 12, 13, 14]
|
|
2190
|
-
# [15, 16, 17, 18]
|
|
2191
|
-
# [19, 20]
|
|
2227
|
+
# enum.slice_after(pattern).each { |ary| ... }
|
|
2228
|
+
# enum.slice_after { |elt| bool }.each { |ary| ... }
|
|
2192
2229
|
#
|
|
2193
2230
|
# Other methods of the Enumerator class and Enumerable module, such as `map`,
|
|
2194
2231
|
# etc., are also usable.
|
|
@@ -2209,7 +2246,7 @@ module Enumerable[unchecked out Elem] : _Each[Elem]
|
|
|
2209
2246
|
# <!--
|
|
2210
2247
|
# rdoc-file=enum.c
|
|
2211
2248
|
# - slice_before(pattern) -> enumerator
|
|
2212
|
-
# - slice_before {|
|
|
2249
|
+
# - slice_before {|elt| ... } -> enumerator
|
|
2213
2250
|
# -->
|
|
2214
2251
|
# With argument `pattern`, returns an enumerator that uses the pattern to
|
|
2215
2252
|
# partition elements into arrays ("slices"). An element begins a new slice if
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
%a{annotate:rdoc:skip}
|
|
2
|
+
class Enumerator[unchecked out Elem, out Return]
|
|
3
|
+
# <!-- rdoc-file=enumerator.c -->
|
|
4
|
+
# Enumerator::Product generates a Cartesian product of any number of enumerable
|
|
5
|
+
# objects. Iterating over the product of enumerable objects is roughly
|
|
6
|
+
# equivalent to nested each_entry loops where the loop for the rightmost object
|
|
7
|
+
# is put innermost.
|
|
8
|
+
#
|
|
9
|
+
# innings = Enumerator::Product.new(1..9, ['top', 'bottom'])
|
|
10
|
+
#
|
|
11
|
+
# innings.each do |i, h|
|
|
12
|
+
# p [i, h]
|
|
13
|
+
# end
|
|
14
|
+
# # [1, "top"]
|
|
15
|
+
# # [1, "bottom"]
|
|
16
|
+
# # [2, "top"]
|
|
17
|
+
# # [2, "bottom"]
|
|
18
|
+
# # [3, "top"]
|
|
19
|
+
# # [3, "bottom"]
|
|
20
|
+
# # ...
|
|
21
|
+
# # [9, "top"]
|
|
22
|
+
# # [9, "bottom"]
|
|
23
|
+
#
|
|
24
|
+
# The method used against each enumerable object is `each_entry` instead of
|
|
25
|
+
# `each` so that the product of N enumerable objects yields an array of exactly
|
|
26
|
+
# N elements in each iteration.
|
|
27
|
+
#
|
|
28
|
+
# When no enumerator is given, it calls a given block once yielding an empty
|
|
29
|
+
# argument list.
|
|
30
|
+
#
|
|
31
|
+
# This type of objects can be created by Enumerator.product.
|
|
32
|
+
#
|
|
33
|
+
class Product[unchecked out Elem] < Enumerator[Elem, Product[Elem]]
|
|
34
|
+
# <!--
|
|
35
|
+
# rdoc-file=enumerator.c
|
|
36
|
+
# - Enumerator::Product.new(*enums) -> enum
|
|
37
|
+
# -->
|
|
38
|
+
# Generates a new enumerator object that generates a Cartesian product of given
|
|
39
|
+
# enumerable objects.
|
|
40
|
+
#
|
|
41
|
+
# e = Enumerator::Product.new(1..3, [4, 5])
|
|
42
|
+
# e.to_a #=> [[1, 4], [1, 5], [2, 4], [2, 5], [3, 4], [3, 5]]
|
|
43
|
+
# e.size #=> 6
|
|
44
|
+
#
|
|
45
|
+
def initialize: (*_EachEntry[Elem]) -> void
|
|
46
|
+
|
|
47
|
+
include Enumerable[Elem]
|
|
48
|
+
|
|
49
|
+
public
|
|
50
|
+
|
|
51
|
+
# <!--
|
|
52
|
+
# rdoc-file=enumerator.c
|
|
53
|
+
# - obj.each { |...| ... } -> obj
|
|
54
|
+
# - obj.each -> enumerator
|
|
55
|
+
# -->
|
|
56
|
+
# Iterates over the elements of the first enumerable by calling the "each_entry"
|
|
57
|
+
# method on it with the given arguments, then proceeds to the following
|
|
58
|
+
# enumerables in sequence until all of the enumerables are exhausted.
|
|
59
|
+
#
|
|
60
|
+
# If no block is given, returns an enumerator. Otherwise, returns self.
|
|
61
|
+
#
|
|
62
|
+
def each: () { (Array[Elem]) -> void } -> self
|
|
63
|
+
|
|
64
|
+
# <!--
|
|
65
|
+
# rdoc-file=enumerator.c
|
|
66
|
+
# - obj.inspect -> string
|
|
67
|
+
# -->
|
|
68
|
+
# Returns a printable version of the product enumerator.
|
|
69
|
+
#
|
|
70
|
+
def inspect: () -> String
|
|
71
|
+
|
|
72
|
+
# <!--
|
|
73
|
+
# rdoc-file=enumerator.c
|
|
74
|
+
# - obj.rewind -> obj
|
|
75
|
+
# -->
|
|
76
|
+
# Rewinds the product enumerator by calling the "rewind" method on each
|
|
77
|
+
# enumerable in reverse order. Each call is performed only if the enumerable
|
|
78
|
+
# responds to the method.
|
|
79
|
+
#
|
|
80
|
+
def rewind: () -> self
|
|
81
|
+
|
|
82
|
+
# <!--
|
|
83
|
+
# rdoc-file=enumerator.c
|
|
84
|
+
# - obj.size -> int, Float::INFINITY or nil
|
|
85
|
+
# -->
|
|
86
|
+
# Returns the total size of the enumerator product calculated by multiplying the
|
|
87
|
+
# sizes of enumerables in the product. If any of the enumerables reports its
|
|
88
|
+
# size as nil or Float::INFINITY, that value is returned as the size.
|
|
89
|
+
#
|
|
90
|
+
def size: () -> (Integer | Float | nil)
|
|
91
|
+
|
|
92
|
+
private
|
|
93
|
+
|
|
94
|
+
def initialize_copy: (Product[Elem]) -> void
|
|
95
|
+
end
|
|
96
|
+
end
|