@@ -20,6 +20,19 @@ public struct ByteBufferToUInt8AsyncSequence<Upstream: AsyncSequence>: AsyncSequ
20
20
public typealias Element = UInt8
21
21
public typealias AsyncIterator = Iterator
22
22
23
+ @usableFromInline
24
+ let upstream : Upstream
25
+
26
+ @inlinable
27
+ init ( _ upstream: Upstream ) {
28
+ self . upstream = upstream
29
+ }
30
+
31
+ @inlinable
32
+ public func makeAsyncIterator( ) -> Iterator {
33
+ Iterator ( self . upstream. makeAsyncIterator ( ) )
34
+ }
35
+
23
36
public struct Iterator: AsyncIteratorProtocol {
24
37
/*private but*/ @usableFromInline var state : State
25
38
@@ -28,79 +41,66 @@ public struct ByteBufferToUInt8AsyncSequence<Upstream: AsyncSequence>: AsyncSequ
28
41
case hasBuffer( ByteBuffer , Upstream . AsyncIterator )
29
42
case askForMore( Upstream . AsyncIterator )
30
43
case finished
31
- case modifying
44
+
45
+ @usableFromInline
46
+ init ( buffer: ByteBuffer , upstream: Upstream . AsyncIterator ) {
47
+ if buffer. readableBytes > 0 {
48
+ self = . hasBuffer( buffer, upstream)
49
+ } else {
50
+ self = . askForMore( upstream)
51
+ }
52
+ }
53
+
54
+ @inlinable
55
+ mutating func next( ) async throws -> Element ? {
56
+ switch self {
57
+ case . askForMore( var upstream) :
58
+ while true {
59
+ switch try await upstream. next ( ) {
60
+ case . some ( let nextBuffer) where nextBuffer. readableBytes == 0 :
61
+ // we received an empty buffer. for this reason, let's continue and get the
62
+ // next buffer fro, the sequence
63
+ continue
64
+
65
+ case . some ( var nextBuffer) :
66
+ assert ( nextBuffer. readableBytes > 0 )
67
+ let result = nextBuffer. readInteger ( as: UInt8 . self)
68
+ self = . init( buffer: nextBuffer, upstream: upstream)
69
+ return result
70
+
71
+ case . none:
72
+ self = . finished
73
+ return nil
74
+ }
75
+ }
76
+
77
+ case . hasBuffer ( var buffer, let upstream) :
78
+ assert( buffer. readableBytes > 0 )
79
+ let result = buffer. readInteger ( as: UInt8 . self)
80
+ self = . init( buffer: buffer, upstream: upstream)
81
+ return result
82
+
83
+ case . finished:
84
+ return nil
85
+ }
86
+ }
32
87
}
33
88
34
- @usableFromInline
89
+ @inlinable
35
90
init( _ upstream: Upstream . AsyncIterator) {
36
91
self . state = . askForMore( upstream)
37
92
}
38
93
39
94
@inlinable
40
95
public mutating func next( ) async throws -> Element? {
41
- switch self . state {
42
- case . askForMore( var upstream) :
43
- self . state = . modifying
44
-
45
- while true {
46
- switch try await upstream. next ( ) {
47
- case . some ( let nextBuffer) where nextBuffer. readableBytes == 0 :
48
- break
49
-
50
- case . some ( var nextBuffer) :
51
- assert ( nextBuffer. readableBytes > 0 )
52
- let result = nextBuffer. readInteger ( as: UInt8 . self)
53
- if nextBuffer. readableBytes > 0 {
54
- self . state = . hasBuffer( nextBuffer, upstream)
55
- } else {
56
- self . state = . askForMore( upstream)
57
- }
58
- return result
59
-
60
- case . none:
61
- self . state = . finished
62
- return nil
63
- }
64
- }
65
-
66
- case . hasBuffer ( var buffer, let upstream) :
67
- assert( buffer. readableBytes > 0 )
68
- self. state = . modifying
69
-
70
- let result = buffer. readInteger ( as: UInt8 . self)
71
- if buffer. readableBytes > 0 {
72
- self . state = . hasBuffer( buffer, upstream)
73
- } else {
74
- self . state = . askForMore( upstream)
75
- }
76
- return result
77
-
78
- case . finished:
79
- return nil
80
-
81
- case . modifying :
82
- preconditionFailure( " Invalid state: \( self . state) " )
83
- }
96
+ try await self . state. next ( )
84
97
}
85
98
}
86
99
87
- @inlinable
88
- public func makeAsyncIterator( ) - > Iterator {
89
- Iterator ( self . upstream. makeAsyncIterator ( ) )
90
- }
91
-
92
- @usableFromInline
93
- let upstream: Upstream
94
-
95
- /*private but*/ @usableFromInline init( _ upstream: Upstream) {
96
- self . upstream = upstream
97
- }
98
100
}
99
101
100
- @usableFromInline
101
- struct TooManyBytesError: Error {
102
- @usableFromInline
103
- init( ) { }
102
+ public struct TooManyBytesError: Error {
103
+ public init( ) { }
104
104
}
105
105
106
106
@available ( macOS 12 , iOS 15 , tvOS 15 , watchOS 8 , * )
0 commit comments