Implemented the "availableData" property for the Pipe+Properties extension in the library target and also, implemented its "append()" function that appends its data concurrently.
This commit is contained in:
parent
d3283c912f
commit
02fb6b9345
72
Library/Sources/Internal/Extensions/Pipe+Properties.swift
Normal file
72
Library/Sources/Internal/Extensions/Pipe+Properties.swift
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
import Foundation
|
||||||
|
|
||||||
|
extension Pipe {
|
||||||
|
|
||||||
|
// MARK: Computed
|
||||||
|
|
||||||
|
var availableData: AsyncAvailableData { .init(self) }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - AsyncAvailableData
|
||||||
|
|
||||||
|
extension Pipe {
|
||||||
|
struct AsyncAvailableData {
|
||||||
|
|
||||||
|
// MARK: Properties
|
||||||
|
|
||||||
|
private let pipe: Pipe
|
||||||
|
|
||||||
|
// MARK: Initialisers
|
||||||
|
|
||||||
|
init(_ pipe: Pipe) {
|
||||||
|
self.pipe = pipe
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: Functions
|
||||||
|
|
||||||
|
func append() async -> Data {
|
||||||
|
var data = Data()
|
||||||
|
|
||||||
|
for await availableData in self {
|
||||||
|
data.append(availableData)
|
||||||
|
}
|
||||||
|
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - AsyncSequence
|
||||||
|
|
||||||
|
extension Pipe.AsyncAvailableData: AsyncSequence {
|
||||||
|
|
||||||
|
// MARK: Type aliases
|
||||||
|
|
||||||
|
typealias AsyncIterator = AsyncStream<Data>.Iterator
|
||||||
|
typealias Element = Data
|
||||||
|
|
||||||
|
// MARK: Functions
|
||||||
|
|
||||||
|
func makeAsyncIterator() -> AsyncIterator {
|
||||||
|
AsyncStream { continuation in
|
||||||
|
pipe.fileHandleForReading.readabilityHandler = { @Sendable handler in
|
||||||
|
let data = handler.availableData
|
||||||
|
|
||||||
|
guard !data.isEmpty else {
|
||||||
|
continuation.finish()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
continuation.yield(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
continuation.onTermination = { _ in
|
||||||
|
pipe.fileHandleForReading.readabilityHandler = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.makeAsyncIterator()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user