@@ -101,47 +101,42 @@ where Base.Element == Subject.Element, Subject.Failure == Error, Base.AsyncItera
101101
102102 /// Allow the `AsyncIterator` to produce elements.
103103 public func connect( ) {
104+ self . isConnected. apply ( criticalState: true )
104105 self . connectedGate. send ( ( ) )
105106 }
106107
107108 func next( ) async {
108- guard !Task. isCancelled else { return }
109-
110- let ( canAccessBase, iterator) = self . state. withCriticalRegion { state -> ( Bool , Base . AsyncIterator ? ) in
111- switch state {
112- case . available( let iterator) :
113- state = . busy
114- return ( true , iterator)
115- case . busy:
116- return ( false , nil )
109+ await Task {
110+ let ( canAccessBase, iterator) = self . state. withCriticalRegion { state -> ( Bool , Base . AsyncIterator ? ) in
111+ switch state {
112+ case . available( let iterator) :
113+ state = . busy
114+ return ( true , iterator)
115+ case . busy:
116+ return ( false , nil )
117+ }
118+ }
119+
120+ guard canAccessBase, var iterator = iterator else { return }
121+
122+ let toSend : Result < Element ? , Error >
123+ do {
124+ let element = try await iterator. next ( )
125+ toSend = . success( element)
126+ } catch {
127+ toSend = . failure( error)
117128 }
118- }
119129
120- guard canAccessBase, var iterator = iterator else { return }
121- defer {
122130 self . state. withCriticalRegion { state in
123131 state = . available( iterator)
124132 }
125- }
126-
127- guard !Task. isCancelled else { return }
128133
129- let toSend : Result < Element ? , Error >
130- do {
131- let element = try await iterator. next ( )
132- toSend = . success( element)
133- } catch {
134- guard !Task. isCancelled else { return }
135- toSend = . failure( error)
136- }
137-
138- guard !Task. isCancelled else { return }
139-
140- switch toSend {
141- case . success( . some( let element) ) : self . subject. send ( element)
142- case . success( . none) : self . subject. send ( . finished)
143- case . failure( let error) : self . subject. send ( . failure( error) )
144- }
134+ switch toSend {
135+ case . success( . some( let element) ) : self . subject. send ( element)
136+ case . success( . none) : self . subject. send ( . finished)
137+ case . failure( let error) : self . subject. send ( . failure( error) )
138+ }
139+ } . value
145140 }
146141
147142 public func makeAsyncIterator( ) -> AsyncIterator {
@@ -163,14 +158,8 @@ where Base.Element == Subject.Element, Subject.Failure == Error, Base.AsyncItera
163158 public mutating func next( ) async rethrows -> Element ? {
164159 guard !Task. isCancelled else { return nil }
165160
166- let shouldWaitForGate = self . isConnected. withCriticalRegion { isConnected -> Bool in
167- if !isConnected {
168- isConnected = true
169- return true
170- }
171- return false
172- }
173- if shouldWaitForGate {
161+ let isConnected = self . isConnected. withCriticalRegion { $0 }
162+ if !isConnected {
174163 await self . connectedGateIterator. next ( )
175164 }
176165
0 commit comments