@@ -284,13 +284,13 @@ extension Calendar {
284
284
struct DatesByMatching : Sendable , Sequence {
285
285
typealias Element = Date
286
286
287
- var calendar : Calendar
288
- var start : Date
289
- var range : Range < Date > ?
290
- var matchingComponents : DateComponents
291
- var matchingPolicy : Calendar . MatchingPolicy
292
- var repeatedTimePolicy : Calendar . RepeatedTimePolicy
293
- var direction : Calendar . SearchDirection
287
+ let calendar : Calendar
288
+ let start : Date
289
+ let range : Range < Date > ?
290
+ let matchingComponents : DateComponents
291
+ let matchingPolicy : Calendar . MatchingPolicy
292
+ let repeatedTimePolicy : Calendar . RepeatedTimePolicy
293
+ let direction : Calendar . SearchDirection
294
294
295
295
init ( calendar: Calendar , start: Date , range: Range < Date > ? , matchingComponents: DateComponents , matchingPolicy: Calendar . MatchingPolicy = . nextTime, repeatedTimePolicy: Calendar . RepeatedTimePolicy = . first, direction: Calendar . SearchDirection = . forward) {
296
296
self . calendar = calendar
@@ -391,14 +391,14 @@ extension Calendar {
391
391
struct DatesByAdding : Sendable , Sequence {
392
392
typealias Element = Date
393
393
394
- var calendar : Calendar
395
- var start : Date
396
- var range : Range < Date > ?
397
- var components : DateComponents ?
398
- var wrappingComponents : Bool
394
+ let calendar : Calendar
395
+ let start : Date
396
+ let range : Range < Date > ?
397
+ let components : DateComponents
398
+ let wrappingComponents : Bool
399
399
400
400
/// If `components` is `nil`, the result is an empty `Sequence`.
401
- internal init ( calendar: Calendar , start: Date , range: Range < Date > ? , components: DateComponents ? , wrappingComponents: Bool ) {
401
+ internal init ( calendar: Calendar , start: Date , range: Range < Date > ? , components: DateComponents , wrappingComponents: Bool ) {
402
402
self . calendar = calendar
403
403
self . start = start
404
404
self . range = range
@@ -407,47 +407,43 @@ extension Calendar {
407
407
}
408
408
409
409
struct Iterator : Sendable , IteratorProtocol {
410
- var calendar : Calendar
411
- var previousResult : Date ?
410
+ let calendar : Calendar
411
+ let start : Date
412
412
let range : Range < Date > ?
413
- var components : DateComponents ?
414
- var wrappingComponents : Bool
413
+ let components : DateComponents
414
+ let wrappingComponents : Bool
415
+ var finished = false
416
+ var iteration = 1
415
417
416
418
/// If `components` is `nil`, the result is an empty `Sequence`.
417
- init ( calendar: Calendar , start: Date , range: Range < Date > ? , components: DateComponents ? , wrappingComponents: Bool ) {
419
+ init ( calendar: Calendar , start: Date , range: Range < Date > ? , components: DateComponents , wrappingComponents: Bool ) {
420
+ self . start = start
418
421
self . calendar = calendar
419
- previousResult = start
420
422
self . components = components
421
423
self . range = range
422
424
self . wrappingComponents = wrappingComponents
423
425
}
424
426
425
427
mutating func next( ) -> Element ? {
426
- guard let components else {
427
- // We have nothing to add
428
+ guard !finished else {
428
429
return nil
429
430
}
430
431
431
- guard let startAt = previousResult else {
432
- // We have finished
433
- return nil
434
- }
435
-
436
- let next = calendar. date ( byAdding: components, to: startAt, wrappingComponents: wrappingComponents)
432
+ let scaled = components. scaled ( by: iteration)
433
+ let next = calendar. date ( byAdding: scaled, to: start, wrappingComponents: wrappingComponents)
437
434
guard let next else {
438
435
// We have finished
439
- previousResult = nil
436
+ finished = false
440
437
return nil
441
438
}
442
439
443
440
if let range, !range. contains ( next) {
444
441
// We are out of the range
445
- previousResult = nil
442
+ finished = true
446
443
return nil
447
444
}
448
445
449
- // Next addition is based on this new result
450
- previousResult = next
446
+ iteration += 1
451
447
return next
452
448
}
453
449
}
0 commit comments