Skip to content

Commit 0469372

Browse files
authored
Implement AsyncSequence/splitLines() (#3411)
~~Implement `AsyncSequence/split()` functions similar to `String/split()` functions in std-lib.~~ Implement `AsyncSequence/splitLines()` functions similar to `String/split(whereSeparator: \.isNewline)` in std-lib. ### Motivation: ~~Provide an easy way for users to split the data incoming from an async sequence, using their preferred separator.~~ Provide an easy way for users to split the data incoming from an async sequence, on new lines. ### Modifications: Add `internal SplitMessageDecoder: NIOSingleStepByteToMessageDecoder`. Add `public NIOSplitLinesMessageDecoder: NIOSingleStepByteToMessageDecoder`. Add `public AsyncSequence/splitLines(omittingEmptySubsequences:maximumBufferSize) -> AsyncSeq<ByteBuffer>`. Add `public AsyncSequence/splitUTF8Lines(omittingEmptySubsequences:maximumBufferSize) -> AsyncSeq<String>`. ### Result: Users can easily split the data.
1 parent f2ad915 commit 0469372

File tree

4 files changed

+761
-28
lines changed

4 files changed

+761
-28
lines changed

Sources/NIOCore/NIODecodedAsyncSequence.swift

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,8 @@ extension NIODecodedAsyncSequence: AsyncSequence {
9595
public struct AsyncIterator: AsyncIteratorProtocol {
9696
@usableFromInline
9797
enum State: Sendable {
98-
case readingFromBuffer
99-
case readLastChunkFromBuffer
98+
case canReadFromBaseIterator
99+
case baseIteratorIsExhausted
100100
case finishedDecoding
101101
}
102102

@@ -114,7 +114,7 @@ extension NIODecodedAsyncSequence: AsyncSequence {
114114
base.decoder,
115115
maximumBufferSize: base.maximumBufferSize
116116
)
117-
self.state = .readingFromBuffer
117+
self.state = .canReadFromBaseIterator
118118
}
119119

120120
/// Retrieve the next element from the ``NIODecodedAsyncSequence``.
@@ -127,7 +127,7 @@ extension NIODecodedAsyncSequence: AsyncSequence {
127127
switch self.state {
128128
case .finishedDecoding:
129129
return nil
130-
case .readingFromBuffer:
130+
case .canReadFromBaseIterator:
131131
let (decoded, ended) = try self.processor.decodeNext(
132132
decodeMode: .normal,
133133
seenEOF: false
@@ -144,11 +144,11 @@ extension NIODecodedAsyncSequence: AsyncSequence {
144144
// Read more data into the buffer so we can decode more messages
145145
guard let nextBuffer = try await self.baseIterator.next() else {
146146
// Ran out of data to read.
147-
self.state = .readLastChunkFromBuffer
147+
self.state = .baseIteratorIsExhausted
148148
continue
149149
}
150150
self.processor.append(nextBuffer)
151-
case .readLastChunkFromBuffer:
151+
case .baseIteratorIsExhausted:
152152
let (decoded, ended) = try self.processor.decodeNext(
153153
decodeMode: .last,
154154
seenEOF: true
@@ -175,7 +175,7 @@ extension NIODecodedAsyncSequence: AsyncSequence {
175175
switch self.state {
176176
case .finishedDecoding:
177177
return nil
178-
case .readingFromBuffer:
178+
case .canReadFromBaseIterator:
179179
let (decoded, ended) = try self.processor.decodeNext(
180180
decodeMode: .normal,
181181
seenEOF: false
@@ -192,11 +192,11 @@ extension NIODecodedAsyncSequence: AsyncSequence {
192192
// Read more data into the buffer so we can decode more messages
193193
guard let nextBuffer = try await self.baseIterator.next(isolation: actor) else {
194194
// Ran out of data to read.
195-
self.state = .readLastChunkFromBuffer
195+
self.state = .baseIteratorIsExhausted
196196
continue
197197
}
198198
self.processor.append(nextBuffer)
199-
case .readLastChunkFromBuffer:
199+
case .baseIteratorIsExhausted:
200200
let (decoded, ended) = try self.processor.decodeNext(
201201
decodeMode: .last,
202202
seenEOF: true

0 commit comments

Comments
 (0)