// // LoadingStateSequence.swift // StoreFlowable // // Created by Kensuke Tamura on 2021/04/18. // extension AsyncSequence { func eraseToLoadingStateSequence() -> LoadingStateSequence where Element == LoadingState { LoadingStateSequence(self) } } /** * AsyncSequence with LoadingState */ public struct LoadingStateSequence: AsyncSequence { public typealias Element = LoadingState public typealias AsyncIterator = Iterator private let makeAsyncIteratorClosure: () -> AsyncIterator public init(_ baseAsyncSequence: BaseAsyncSequence) where BaseAsyncSequence.Element == Element { self.makeAsyncIteratorClosure = { Iterator(baseIterator: baseAsyncSequence.makeAsyncIterator()) } } public func makeAsyncIterator() -> AsyncIterator { Iterator(baseIterator: self.makeAsyncIteratorClosure()) } public struct Iterator: AsyncIteratorProtocol { private let nextClosure: () async -> Element? public init(baseIterator: BaseAsyncIterator) where BaseAsyncIterator.Element == Element { var baseIterator = baseIterator self.nextClosure = { try! await baseIterator.next() } } public func next() async -> Element? { await self.nextClosure() } } }