// // Copyright Amazon.com Inc. or its affiliates. // All Rights Reserved. // // SPDX-License-Identifier: Apache-2.0 // import Foundation public typealias WeakAmplifyAsyncThrowingSequenceRef = WeakRef> public class AmplifyAsyncThrowingSequence: AsyncSequence, Cancellable { public typealias Iterator = AsyncThrowingStream.Iterator private var asyncStream: AsyncThrowingStream! = nil private var continuation: AsyncThrowingStream.Continuation! = nil private var parent: Cancellable? = nil public private(set) var isCancelled: Bool = false public init(parent: Cancellable? = nil, bufferingPolicy: AsyncThrowingStream.Continuation.BufferingPolicy = .unbounded) { self.parent = parent asyncStream = AsyncThrowingStream(Element.self, bufferingPolicy: bufferingPolicy, { continuation in self.continuation = continuation }) } public func makeAsyncIterator() -> Iterator { asyncStream.makeAsyncIterator() } public func send(_ element: Element) { continuation.yield(element) } public func fail(_ error: Error) { continuation.yield(with: .failure(error)) continuation.finish() } public func finish() { continuation.finish() parent = nil } public func cancel() { guard !isCancelled else { return } isCancelled = true parent?.cancel() finish() } }