// // Copyright Amazon.com Inc. or its affiliates. // All Rights Reserved. // // SPDX-License-Identifier: Apache-2.0 // import Foundation public typealias WeakAmplifyAsyncSequenceRef = WeakRef> public class AmplifyAsyncSequence: AsyncSequence, Cancellable { public typealias Iterator = AsyncStream.Iterator private var asyncStream: AsyncStream! = nil private var continuation: AsyncStream.Continuation! = nil private var parent: Cancellable? = nil public private(set) var isCancelled: Bool = false public init(parent: Cancellable? = nil, bufferingPolicy: AsyncStream.Continuation.BufferingPolicy = .unbounded) { self.parent = parent asyncStream = AsyncStream(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 finish() { continuation.finish() parent = nil } public func cancel() { guard !isCancelled else { return } isCancelled = true parent?.cancel() finish() } }