1111
1212// MARK: `RangesCollection`
1313
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
4016 let searcher : Searcher
41- var state : Searcher . State
4217
43- init ( base : Base , searcher: Searcher ) {
44- self . base = base
18+ init ( input : Searcher . Searched , searcher: Searcher ) {
19+ self . input = input
4520 self . searcher = searcher
46- self . state = searcher. state ( for: base, in: base. startIndex..< base. endIndex)
4721 }
4822
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
6525 var state : Searcher . State
66- }
6726
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)
8930 }
90- return range
91- }
92- }
9331
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)
10334 }
10435 }
36+ }
10537
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 )
11541 }
11642}
11743
@@ -122,8 +48,8 @@ extension RangesCollection.Index: Comparable {
12248extension Collection {
12349 func _ranges< S: CollectionSearcher > (
12450 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)
12753 }
12854}
12955
@@ -132,7 +58,7 @@ extension Collection {
13258extension Collection where Element: Equatable {
13359 func _ranges< C: Collection > (
13460 of other: C
135- ) -> RangesCollection < ZSearcher < Self > > where C. Element == Element {
61+ ) -> RangesSequence < ZSearcher < Self > > where C. Element == Element {
13662 _ranges ( of: ZSearcher ( pattern: Array ( other) , by: == ) )
13763 }
13864
@@ -163,8 +89,8 @@ extension Collection where Element: Equatable {
16389}
16490
16591@available ( SwiftStdlib 5 . 7 , * )
166- struct RegexRangesCollection < Output> {
167- let base : RegexMatchesCollection < Output >
92+ struct RegexRangesSequence < Output> {
93+ let base : RegexMatchesSequence < Output >
16894
16995 init (
17096 input: String ,
@@ -181,9 +107,9 @@ struct RegexRangesCollection<Output> {
181107}
182108
183109@available ( SwiftStdlib 5 . 7 , * )
184- extension RegexRangesCollection : Sequence {
110+ extension RegexRangesSequence : Sequence {
185111 struct Iterator : IteratorProtocol {
186- var matchesBase : RegexMatchesCollection < Output > . Iterator
112+ var matchesBase : RegexMatchesSequence < Output > . Iterator
187113
188114 mutating func next( ) -> Range < String . Index > ? {
189115 matchesBase. next ( ) . map ( \. range)
@@ -195,16 +121,6 @@ extension RegexRangesCollection: Sequence {
195121 }
196122}
197123
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-
208124// MARK: Regex algorithms
209125
210126extension Collection where SubSequence == Substring {
@@ -214,8 +130,8 @@ extension Collection where SubSequence == Substring {
214130 of regex: R ,
215131 subjectBounds: Range < String . Index > ,
216132 searchBounds: Range < String . Index >
217- ) -> RegexRangesCollection < R . RegexOutput > {
218- RegexRangesCollection (
133+ ) -> RegexRangesSequence < R . RegexOutput > {
134+ RegexRangesSequence (
219135 input: self [ ... ] . base,
220136 subjectBounds: subjectBounds,
221137 searchBounds: searchBounds,
@@ -226,7 +142,7 @@ extension Collection where SubSequence == Substring {
226142 @_disfavoredOverload
227143 func _ranges< R: RegexComponent > (
228144 of regex: R
229- ) -> RegexRangesCollection < R . RegexOutput > {
145+ ) -> RegexRangesSequence < R . RegexOutput > {
230146 _ranges (
231147 of: regex,
232148 subjectBounds: startIndex..< endIndex,
0 commit comments