@@ -33,15 +33,15 @@ public struct AsyncBufferSequence: AsyncSequence, Sendable {
33
33
private var buffer : [ UInt8 ]
34
34
private var currentPosition : Int
35
35
private var finished : Bool
36
- private var streamIterator : AsyncThrowingStream < StreamStatus , Swift . Error > . AsyncIterator
36
+ private var streamIterator : AsyncThrowingStream < TrackedPlatformDiskIO . StreamStatus , Swift . Error > . AsyncIterator
37
37
38
38
internal init ( diskIO: TrackedPlatformDiskIO , bufferSize: Int ) {
39
39
self . diskIO = diskIO
40
40
self . bufferSize = bufferSize
41
41
self . buffer = [ ]
42
42
self . currentPosition = 0
43
43
self . finished = false
44
- self . streamIterator = Self . createDataStream ( with : diskIO. dispatchIO , bufferSize : bufferSize) . makeAsyncIterator ( )
44
+ self . streamIterator = diskIO. readDataStream ( upToLength : bufferSize) . makeAsyncIterator ( )
45
45
}
46
46
47
47
public mutating func next( ) async throws -> SequenceOutput . Buffer ? {
@@ -51,66 +51,18 @@ public struct AsyncBufferSequence: AsyncSequence, Sendable {
51
51
return data
52
52
53
53
case . endOfStream( let data) :
54
- streamIterator = Self . createDataStream ( with : diskIO. dispatchIO , bufferSize : bufferSize) . makeAsyncIterator ( )
54
+ streamIterator = diskIO. readDataStream ( upToLength : bufferSize) . makeAsyncIterator ( )
55
55
return data
56
56
57
57
case . endOfFile:
58
- try self . diskIO. safelyClose ( )
58
+ // try self.diskIO.safelyClose()
59
59
return nil
60
60
}
61
61
} else {
62
- try self . diskIO. safelyClose ( )
62
+ // try self.diskIO.safelyClose()
63
63
return nil
64
64
}
65
65
}
66
-
67
- private enum StreamStatus {
68
- case data( SequenceOutput . Buffer )
69
- case endOfStream( SequenceOutput . Buffer )
70
- case endOfFile
71
- }
72
-
73
- private static func createDataStream( with dispatchIO: DispatchIO , bufferSize: Int ) -> AsyncThrowingStream < StreamStatus , Swift . Error > {
74
- return AsyncThrowingStream < StreamStatus , Swift . Error > { continuation in
75
- dispatchIO. read (
76
- offset: 0 ,
77
- length: bufferSize,
78
- queue: . global( )
79
- ) { done, data, error in
80
- if error != 0 {
81
- continuation. finish ( throwing: SubprocessError (
82
- code: . init( . failedToReadFromSubprocess) ,
83
- underlyingError: . init( rawValue: error)
84
- ) )
85
- return
86
- }
87
-
88
- // Treat empty data and nil as the same
89
- let buffer = data. map { $0. isEmpty ? nil : $0 } ?? nil
90
- let status : StreamStatus
91
-
92
- switch ( buffer, done) {
93
- case ( . some( let data) , false ) :
94
- status = . data( SequenceOutput . Buffer ( data: data) )
95
-
96
- case ( . some( let data) , true ) :
97
- status = . endOfStream( SequenceOutput . Buffer ( data: data) )
98
-
99
- case ( nil , false ) :
100
- return
101
-
102
- case ( nil , true ) :
103
- status = . endOfFile
104
- }
105
-
106
- continuation. yield ( status)
107
-
108
- if done {
109
- continuation. finish ( )
110
- }
111
- }
112
- }
113
- }
114
66
}
115
67
116
68
private let diskIO : TrackedPlatformDiskIO
@@ -126,6 +78,14 @@ public struct AsyncBufferSequence: AsyncSequence, Sendable {
126
78
}
127
79
}
128
80
81
+ extension TrackedPlatformDiskIO {
82
+ internal enum StreamStatus {
83
+ case data( SequenceOutput . Buffer )
84
+ case endOfStream( SequenceOutput . Buffer )
85
+ case endOfFile
86
+ }
87
+ }
88
+
129
89
// MARK: - Page Size
130
90
import _SubprocessCShims
131
91
0 commit comments