📚
[Swift] start-with的なAsyncSequence
subscribeした時に初期値をすぐに発行するAsyncSequence
public struct AsyncStartWithSequence<Base: AsyncSequence>: AsyncSequence {
public struct AsyncIterator: AsyncIteratorProtocol {
public typealias Element = Base.Element
private var base: Base.AsyncIterator
private var first: Base.Element?
init(_ value: Base.AsyncIterator, startWith: Base.Element) {
self.base = value
self.first = startWith
}
public mutating func next() async throws -> Base.Element? {
if let first = first {
self.first = nil
return first
}
return try await base.next()
}
}
public typealias Element = Base.Element
let base: Base
let startWith: Base.Element
init(_ base: Base, startWith: Base.Element) {
self.base = base
self.startWith = startWith
}
public func makeAsyncIterator() -> AsyncIterator {
return AsyncIterator(base.makeAsyncIterator(), startWith: startWith)
}
}
extension AsyncStartWithSequence: Sendable where Base.Element: Sendable, Base: Sendable {}
Discussion