11
11
12
12
// MARK: `RangesCollection`
13
13
14
- struct RangesCollection < Searcher: CollectionSearcher > {
15
- public typealias Base = Searcher . Searched
16
-
17
- let base : Base
18
- let searcher : Searcher
19
- private( set) public var startIndex : Index
20
-
21
- init ( base: Base , searcher: Searcher ) {
22
- self . base = base
23
- self . searcher = searcher
24
-
25
- var state = searcher. state ( for: base, in: base. startIndex..< base. endIndex)
26
- self . startIndex = Index ( range: nil , state: state)
27
-
28
- if let range = searcher. search ( base, & state) {
29
- self . startIndex = Index ( range: range, state: state)
30
- } else {
31
- self . startIndex = endIndex
32
- }
33
- }
34
- }
35
-
36
- struct RangesIterator < Searcher: CollectionSearcher > : IteratorProtocol {
37
- public typealias Base = Searcher . Searched
38
-
39
- let base : Base
14
+ struct RangesSequence < Searcher: CollectionSearcher > {
15
+ let input : Searcher . Searched
40
16
let searcher : Searcher
41
- var state : Searcher . State
42
17
43
- init ( base : Base , searcher: Searcher ) {
44
- self . base = base
18
+ init ( input : Searcher . Searched , searcher: Searcher ) {
19
+ self . input = input
45
20
self . searcher = searcher
46
- self . state = searcher. state ( for: base, in: base. startIndex..< base. endIndex)
47
21
}
48
22
49
- public mutating func next( ) -> Range < Base . Index > ? {
50
- searcher. search ( base, & state)
51
- }
52
- }
53
-
54
- extension RangesCollection : Sequence {
55
- public func makeIterator( ) -> RangesIterator < Searcher > {
56
- Iterator ( base: base, searcher: searcher)
57
- }
58
- }
59
-
60
- extension RangesCollection : Collection {
61
- // TODO: Custom `SubSequence` for the sake of more efficient slice iteration
62
-
63
- public struct Index {
64
- var range : Range < Searcher . Searched . Index > ?
23
+ struct Iterator : IteratorProtocol {
24
+ let base : RangesSequence
65
25
var state : Searcher . State
66
- }
67
26
68
- public var endIndex : Index {
69
- // TODO: Avoid calling `state(for:startingAt)` here
70
- Index (
71
- range: nil ,
72
- state: searcher. state ( for: base, in: base. startIndex..< base. endIndex) )
73
- }
74
-
75
- public func formIndex( after index: inout Index ) {
76
- guard index != endIndex else { fatalError ( " Cannot advance past endIndex " ) }
77
- index. range = searcher. search ( base, & index. state)
78
- }
79
-
80
- public func index( after index: Index ) -> Index {
81
- var index = index
82
- formIndex ( after: & index)
83
- return index
84
- }
85
-
86
- public subscript( index: Index ) -> Range < Base . Index > {
87
- guard let range = index. range else {
88
- fatalError ( " Cannot subscript using endIndex " )
27
+ init ( _ base: RangesSequence ) {
28
+ self . base = base
29
+ self . state = base. searcher. state ( for: base. input, in: base. input. startIndex..< base. input. endIndex)
89
30
}
90
- return range
91
- }
92
- }
93
31
94
- extension RangesCollection . Index : Comparable {
95
- static func == ( lhs: Self , rhs: Self ) -> Bool {
96
- switch ( lhs. range, rhs. range) {
97
- case ( nil , nil ) :
98
- return true
99
- case ( nil , _? ) , ( _? , nil ) :
100
- return false
101
- case ( let lhs? , let rhs? ) :
102
- return lhs. lowerBound == rhs. lowerBound
32
+ mutating func next( ) -> Range < Searcher . Searched . Index > ? {
33
+ base. searcher. search ( base. input, & state)
103
34
}
104
35
}
36
+ }
105
37
106
- static func < ( lhs: Self , rhs: Self ) -> Bool {
107
- switch ( lhs. range, rhs. range) {
108
- case ( nil , _) :
109
- return false
110
- case ( _, nil ) :
111
- return true
112
- case ( let lhs? , let rhs? ) :
113
- return lhs. lowerBound < rhs. lowerBound
114
- }
38
+ extension RangesSequence : Sequence {
39
+ func makeIterator( ) -> Iterator {
40
+ Iterator ( self )
115
41
}
116
42
}
117
43
@@ -122,8 +48,8 @@ extension RangesCollection.Index: Comparable {
122
48
extension Collection {
123
49
func _ranges< S: CollectionSearcher > (
124
50
of searcher: S
125
- ) -> RangesCollection < S > where S. Searched == Self {
126
- RangesCollection ( base : self , searcher: searcher)
51
+ ) -> RangesSequence < S > where S. Searched == Self {
52
+ RangesSequence ( input : self , searcher: searcher)
127
53
}
128
54
}
129
55
@@ -132,7 +58,7 @@ extension Collection {
132
58
extension Collection where Element: Equatable {
133
59
func _ranges< C: Collection > (
134
60
of other: C
135
- ) -> RangesCollection < ZSearcher < Self > > where C. Element == Element {
61
+ ) -> RangesSequence < ZSearcher < Self > > where C. Element == Element {
136
62
_ranges ( of: ZSearcher ( pattern: Array ( other) , by: == ) )
137
63
}
138
64
@@ -163,8 +89,8 @@ extension Collection where Element: Equatable {
163
89
}
164
90
165
91
@available ( SwiftStdlib 5 . 7 , * )
166
- struct RegexRangesCollection < Output> {
167
- let base : RegexMatchesCollection < Output >
92
+ struct RegexRangesSequence < Output> {
93
+ let base : RegexMatchesSequence < Output >
168
94
169
95
init (
170
96
input: String ,
@@ -181,9 +107,9 @@ struct RegexRangesCollection<Output> {
181
107
}
182
108
183
109
@available ( SwiftStdlib 5 . 7 , * )
184
- extension RegexRangesCollection : Sequence {
110
+ extension RegexRangesSequence : Sequence {
185
111
struct Iterator : IteratorProtocol {
186
- var matchesBase : RegexMatchesCollection < Output > . Iterator
112
+ var matchesBase : RegexMatchesSequence < Output > . Iterator
187
113
188
114
mutating func next( ) -> Range < String . Index > ? {
189
115
matchesBase. next ( ) . map ( \. range)
@@ -195,16 +121,6 @@ extension RegexRangesCollection: Sequence {
195
121
}
196
122
}
197
123
198
- @available ( SwiftStdlib 5 . 7 , * )
199
- extension RegexRangesCollection : Collection {
200
- typealias Index = RegexMatchesCollection < Output > . Index
201
-
202
- var startIndex : Index { base. startIndex }
203
- var endIndex : Index { base. endIndex }
204
- func index( after i: Index ) -> Index { base. index ( after: i) }
205
- subscript( position: Index ) -> Range < String . Index > { base [ position] . range }
206
- }
207
-
208
124
// MARK: Regex algorithms
209
125
210
126
extension Collection where SubSequence == Substring {
@@ -214,8 +130,8 @@ extension Collection where SubSequence == Substring {
214
130
of regex: R ,
215
131
subjectBounds: Range < String . Index > ,
216
132
searchBounds: Range < String . Index >
217
- ) -> RegexRangesCollection < R . RegexOutput > {
218
- RegexRangesCollection (
133
+ ) -> RegexRangesSequence < R . RegexOutput > {
134
+ RegexRangesSequence (
219
135
input: self [ ... ] . base,
220
136
subjectBounds: subjectBounds,
221
137
searchBounds: searchBounds,
@@ -226,7 +142,7 @@ extension Collection where SubSequence == Substring {
226
142
@_disfavoredOverload
227
143
func _ranges< R: RegexComponent > (
228
144
of regex: R
229
- ) -> RegexRangesCollection < R . RegexOutput > {
145
+ ) -> RegexRangesSequence < R . RegexOutput > {
230
146
_ranges (
231
147
of: regex,
232
148
subjectBounds: startIndex..< endIndex,
0 commit comments