Skip to content

Commit 3faaf3c

Browse files
committed
House mutations in local scope
1 parent d0f2e06 commit 3faaf3c

File tree

6 files changed

+128
-38
lines changed

6 files changed

+128
-38
lines changed

stdlib/public/Concurrency/AsyncCompactMapSequence.swift

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,12 @@ public struct AsyncCompactMapSequence<Upstream, ElementOfResult>: AsyncSequence
3737

3838
public mutating func next() async rethrows -> ElementOfResult? {
3939
while true {
40-
guard let item = try await upstreamIterator?.next() else {
40+
guard var upstreamIterator = self.upstreamIterator else {
41+
return nil
42+
}
43+
defer { self.upstreamIterator = upstreamIterator }
44+
45+
guard let item = try await upstreamIterator.next() else {
4146
return nil
4247
}
4348
if let transformed = await transform(item) {
@@ -80,16 +85,22 @@ public struct AsyncTryCompactMapSequence<Upstream, ElementOfResult>: AsyncSequen
8085

8186
public mutating func next() async throws -> ElementOfResult? {
8287
while true {
83-
guard let item = try await upstreamIterator?.next() else {
88+
guard var upstreamIterator = self.upstreamIterator else {
89+
return nil
90+
}
91+
92+
guard let item = try await upstreamIterator.next() else {
8493
return nil
8594
}
8695
do {
8796
if let transformed = try await transform(item) {
97+
self.upstreamIterator = upstreamIterator
8898
return transformed
8999
}
100+
self.upstreamIterator = upstreamIterator
90101
} catch {
91-
upstreamIterator?.cancel()
92-
upstreamIterator = nil
102+
upstreamIterator.cancel()
103+
self.upstreamIterator = nil
93104
throw error
94105
}
95106
}

stdlib/public/Concurrency/AsyncDropWhileSequence.swift

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,12 @@ public struct AsyncDropWhileSequence<Upstream>: AsyncSequence where Upstream: As
3737

3838
public mutating func next() async rethrows -> Upstream.Element? {
3939
while true {
40-
guard let item = try await upstreamIterator?.next() else {
40+
guard var upstreamIterator = self.upstreamIterator else {
41+
return nil
42+
}
43+
defer { self.upstreamIterator = upstreamIterator }
44+
45+
guard let item = try await upstreamIterator.next() else {
4146
return nil
4247
}
4348
if let predicate = self.predicate {
@@ -85,21 +90,29 @@ public struct AsyncTryDropWhileSequence<Upstream>: AsyncSequence where Upstream:
8590

8691
public mutating func next() async throws -> Upstream.Element? {
8792
while true {
88-
guard let item = try await upstreamIterator?.next() else {
93+
guard var upstreamIterator = self.upstreamIterator else {
94+
return nil
95+
}
96+
97+
guard let item = try await upstreamIterator.next() else {
98+
self.upstreamIterator = upstreamIterator
8999
return nil
90100
}
91101
if let predicate = self.predicate {
92102
do {
93103
if !(try await predicate(item)) {
94104
self.predicate = nil
105+
self.upstreamIterator = upstreamIterator
95106
return item
96107
}
108+
self.upstreamIterator = upstreamIterator
97109
} catch {
98-
upstreamIterator?.cancel()
99-
upstreamIterator = nil
110+
upstreamIterator.cancel()
111+
self.upstreamIterator = nil
100112
throw error
101113
}
102114
} else {
115+
self.upstreamIterator = upstreamIterator
103116
return item
104117
}
105118
}

stdlib/public/Concurrency/AsyncFilterSequence.swift

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,20 @@ public struct AsyncFilterSequence<Upstream>: AsyncSequence where Upstream: Async
4141
}
4242

4343
public mutating func next() async rethrows -> Upstream.Element? {
44-
guard let item = try await upstreamIterator?.next() else {
44+
guard var upstreamIterator = self.upstreamIterator else {
45+
return nil
46+
}
47+
48+
guard let item = try await upstreamIterator.next() else {
49+
self.upstreamIterator = upstreamIterator
4550
return nil
4651
}
4752
guard await predicate(item) else {
48-
upstreamIterator?.cancel()
49-
upstreamIterator = nil
50-
return nil
53+
upstreamIterator.cancel()
54+
self.upstreamIterator = nil
55+
return nil
5156
}
57+
self.upstreamIterator = upstreamIterator
5258
return item
5359
}
5460

@@ -87,14 +93,19 @@ public struct AsyncTryFilterSequence<Upstream>: AsyncSequence where Upstream: As
8793
}
8894

8995
public mutating func next() async throws -> Upstream.Element? {
90-
guard let item = try await upstreamIterator?.next() else {
96+
guard var upstreamIterator = self.upstreamIterator else {
97+
return nil
98+
}
99+
100+
guard let item = try await upstreamIterator.next() else {
91101
return nil
92102
}
93103
guard try await predicate(item) else {
94-
upstreamIterator?.cancel()
95-
upstreamIterator = nil
96-
return nil
104+
upstreamIterator.cancel()
105+
self.upstreamIterator = nil
106+
return nil
97107
}
108+
self.upstreamIterator = upstreamIterator
98109
return item
99110
}
100111

stdlib/public/Concurrency/AsyncFlatMapSequence.swift

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,34 @@ public struct AsyncFlatMapSequence<Upstream, SegmentOfResult: AsyncSequence>: As
3535
self.upstreamIterator = upstreamIterator
3636
self.transform = transform
3737
}
38+
39+
mutating func nextUpstream() async rethrows -> SegmentOfResult.Element? {
40+
guard var upstreamIterator = self.upstreamIterator else {
41+
return nil
42+
}
43+
44+
guard let item = try await upstreamIterator.next() else {
45+
self.upstreamIterator = upstreamIterator
46+
return nil
47+
}
48+
let segment = await transform(item)
49+
var currentIterator = segment.makeAsyncIterator()
50+
self.currentIterator = currentIterator
51+
self.upstreamIterator = upstreamIterator
52+
return try await currentIterator.next()
53+
}
3854

3955
public mutating func next() async rethrows -> SegmentOfResult.Element? {
40-
if let item = try await currentIterator?.next() {
56+
guard var currentIterator = self.currentIterator else {
57+
return try await nextUpstream()
58+
}
59+
60+
if let item = try await currentIterator.next() {
61+
self.currentIterator = currentIterator
4162
return item
4263
} else {
43-
guard let item = try await upstreamIterator?.next() else {
44-
return nil
45-
}
46-
let segment = await transform(item)
47-
currentIterator = segment.makeAsyncIterator()
48-
return try await currentIterator?.next()
64+
self.currentIterator = currentIterator
65+
return try await nextUpstream()
4966
}
5067
}
5168

@@ -83,17 +100,34 @@ public struct AsyncTryFlatMapSequence<Upstream, SegmentOfResult: AsyncSequence>:
83100
self.upstreamIterator = upstreamIterator
84101
self.transform = transform
85102
}
103+
104+
mutating func nextUpstream() async throws -> SegmentOfResult.Element? {
105+
guard var upstreamIterator = self.upstreamIterator else {
106+
return nil
107+
}
108+
109+
guard let item = try await upstreamIterator.next() else {
110+
self.upstreamIterator = upstreamIterator
111+
return nil
112+
}
113+
let segment = try await transform(item)
114+
var currentIterator = segment.makeAsyncIterator()
115+
self.currentIterator = currentIterator
116+
self.upstreamIterator = upstreamIterator
117+
return try await currentIterator.next()
118+
}
86119

87120
public mutating func next() async throws -> SegmentOfResult.Element? {
88-
if let item = try await currentIterator?.next() {
121+
guard var currentIterator = self.currentIterator else {
122+
return try await nextUpstream()
123+
}
124+
125+
if let item = try await currentIterator.next() {
126+
self.currentIterator = currentIterator
89127
return item
90128
} else {
91-
guard let item = try await upstreamIterator?.next() else {
92-
return nil
93-
}
94-
let segment = try await transform(item)
95-
currentIterator = segment.makeAsyncIterator()
96-
return try await currentIterator?.next()
129+
self.currentIterator = currentIterator
130+
return try await nextUpstream()
97131
}
98132
}
99133

stdlib/public/Concurrency/AsyncMapSequence.swift

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,12 @@ public struct AsyncMapSequence<Upstream, Transformed>: AsyncSequence where Upstr
3838
}
3939

4040
public mutating func next() async rethrows -> Transformed? {
41-
guard let item = try await upstreamIterator?.next() else {
41+
guard var upstreamIterator = self.upstreamIterator else {
42+
return nil
43+
}
44+
defer { self.upstreamIterator = upstreamIterator }
45+
46+
guard let item = try await upstreamIterator.next() else {
4247
return nil
4348
}
4449
return await transform(item)
@@ -79,7 +84,12 @@ public struct AsyncTryMapSequence<Upstream, Transformed>: AsyncSequence where Up
7984
}
8085

8186
public mutating func next() async throws -> Transformed? {
82-
guard let item = try await upstreamIterator?.next() else {
87+
guard var upstreamIterator = self.upstreamIterator else {
88+
return nil
89+
}
90+
defer { self.upstreamIterator = upstreamIterator }
91+
92+
guard let item = try await upstreamIterator.next() else {
8393
return nil
8494
}
8595
return try await transform(item)

stdlib/public/Concurrency/AsyncPrefixWhileSequence.swift

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,19 @@ public struct AsyncPrefixWhileSequence<Upstream>: AsyncSequence where Upstream:
3636
}
3737

3838
public mutating func next() async rethrows -> Element? {
39-
guard let item = try await upstreamIterator?.next() else {
39+
guard var upstreamIterator = self.upstreamIterator else {
40+
return nil
41+
}
42+
43+
guard let item = try await upstreamIterator.next() else {
4044
return nil
4145
}
4246
guard await predicate(item) else {
43-
upstreamIterator?.cancel()
44-
upstreamIterator = nil
47+
upstreamIterator.cancel()
48+
self.upstreamIterator = nil
4549
return nil
4650
}
51+
self.upstreamIterator = upstreamIterator
4752
return item
4853
}
4954

@@ -80,14 +85,20 @@ public struct AsyncTryPrefixWhileSequence<Upstream>: AsyncSequence where Upstrea
8085
}
8186

8287
public mutating func next() async throws -> Element? {
83-
guard let item = try await upstreamIterator?.next() else {
88+
guard var upstreamIterator = self.upstreamIterator else {
89+
return nil
90+
}
91+
92+
guard let item = try await upstreamIterator.next() else {
93+
self.upstreamIterator = upstreamIterator
8494
return nil
8595
}
8696
guard try await predicate(item) else {
87-
upstreamIterator?.cancel()
88-
upstreamIterator = nil
97+
upstreamIterator.cancel()
98+
self.upstreamIterator = nil
8999
return nil
90100
}
101+
self.upstreamIterator = upstreamIterator
91102
return item
92103
}
93104

0 commit comments

Comments
 (0)