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