@@ -16,16 +16,19 @@ struct BoundedBufferStateMachine<Base: AsyncSequence> {
1616 typealias SuspendedProducer = UnsafeContinuation < Void , Never >
1717 typealias SuspendedConsumer = UnsafeContinuation < Result < Base . Element , Error > ? , Never >
1818
19+ // We are using UnsafeTransfer here since we have to get the elements from the task
20+ // into the consumer task. This is a transfer but we cannot prove this to the compiler at this point
21+ // since next is not marked as transferring the return value.
1922 fileprivate enum State {
2023 case initial( base: Base )
2124 case buffering(
2225 task: Task < Void , Never > ,
23- buffer: Deque < Result < Element , Error > > ,
26+ buffer: Deque < Result < UnsafeTransfer < Element > , Error > > ,
2427 suspendedProducer: SuspendedProducer ? ,
2528 suspendedConsumer: SuspendedConsumer ?
2629 )
2730 case modifying
28- case finished( buffer: Deque < Result < Element , Error > > )
31+ case finished( buffer: Deque < Result < UnsafeTransfer < Element > , Error > > )
2932 }
3033
3134 private var state : State
@@ -139,7 +142,7 @@ struct BoundedBufferStateMachine<Base: AsyncSequence> {
139142 // we have to stack the new element or suspend the producer if the buffer is full
140143 precondition ( buffer. count < limit, " Invalid state. The buffer should be available for stacking a new element. " )
141144 self . state = . modifying
142- buffer. append ( . success( element) )
145+ buffer. append ( . success( . init ( element) ) )
143146 self . state = . buffering( task: task, buffer: buffer, suspendedProducer: nil , suspendedConsumer: nil )
144147 return . none
145148
@@ -218,7 +221,7 @@ struct BoundedBufferStateMachine<Base: AsyncSequence> {
218221 self . state = . modifying
219222 let result = buffer. popFirst ( ) !
220223 self . state = . buffering( task: task, buffer: buffer, suspendedProducer: nil , suspendedConsumer: nil )
221- return . returnResult( producerContinuation: suspendedProducer, result: result)
224+ return . returnResult( producerContinuation: suspendedProducer, result: result. map { $0 . wrapped } )
222225
223226 case . buffering( _, _, _, . some) :
224227 preconditionFailure ( " Invalid states. There is already a suspended consumer. " )
@@ -233,7 +236,7 @@ struct BoundedBufferStateMachine<Base: AsyncSequence> {
233236 self . state = . modifying
234237 let result = buffer. popFirst ( ) !
235238 self . state = . finished( buffer: buffer)
236- return . returnResult( producerContinuation: nil , result: result)
239+ return . returnResult( producerContinuation: nil , result: result. map { $0 . wrapped } )
237240 }
238241 }
239242
@@ -257,7 +260,7 @@ struct BoundedBufferStateMachine<Base: AsyncSequence> {
257260 self . state = . modifying
258261 let result = buffer. popFirst ( ) !
259262 self . state = . buffering( task: task, buffer: buffer, suspendedProducer: nil , suspendedConsumer: nil )
260- return . returnResult( producerContinuation: suspendedProducer, result: result)
263+ return . returnResult( producerContinuation: suspendedProducer, result: result. map { $0 . wrapped } )
261264
262265 case . buffering( _, _, _, . some) :
263266 preconditionFailure ( " Invalid states. There is already a suspended consumer. " )
@@ -272,7 +275,7 @@ struct BoundedBufferStateMachine<Base: AsyncSequence> {
272275 self . state = . modifying
273276 let result = buffer. popFirst ( ) !
274277 self . state = . finished( buffer: buffer)
275- return . returnResult( producerContinuation: nil , result: result)
278+ return . returnResult( producerContinuation: nil , result: result. map { $0 . wrapped } )
276279 }
277280 }
278281
0 commit comments