Skip to content

Commit 66f2919

Browse files
committed
Fixed bug in text.lines that did not handle a CRLF that spanned chunks
1 parent 689cf29 commit 66f2919

File tree

3 files changed

+10
-8
lines changed

3 files changed

+10
-8
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@ z_local.sbt
1313
.DS_Store
1414
.ensime
1515
/.ensime_cache
16+
.tags

core/src/main/scala/fs2/text.scala

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,11 @@ object text {
102102
(out, carry)
103103
}
104104

105-
def extractLines(buffer: Vector[String], chunk: Chunk[String]): (Chunk[String], Vector[String]) = {
105+
def extractLines(buffer: Vector[String], chunk: Chunk[String], pendingLineFeed: Boolean): (Chunk[String], Vector[String], Boolean) = {
106106
@annotation.tailrec
107-
def loop(remainingInput: Vector[String], buffer: Vector[String], output: Vector[String], pendingLineFeed: Boolean): (Chunk[String], Vector[String]) = {
107+
def loop(remainingInput: Vector[String], buffer: Vector[String], output: Vector[String], pendingLineFeed: Boolean): (Chunk[String], Vector[String], Boolean) = {
108108
if (remainingInput.isEmpty) {
109-
Chunk.indexedSeq(output) -> buffer
109+
(Chunk.indexedSeq(output), buffer, pendingLineFeed)
110110
} else {
111111
var next = remainingInput.head
112112
if (pendingLineFeed) {
@@ -125,18 +125,18 @@ object text {
125125
}
126126
}
127127
}
128-
loop(chunk.toVector, buffer, Vector.empty, false)
128+
loop(chunk.toVector, buffer, Vector.empty, pendingLineFeed)
129129
}
130130

131-
def go(buffer: Vector[String]): Handle[F, String] => Pull[F, String, Unit] = {
131+
def go(buffer: Vector[String], pendingLineFeed: Boolean): Handle[F, String] => Pull[F, String, Unit] = {
132132
Pull.receiveOption[F,String,String,Unit] {
133133
case Some(chunk #: h) =>
134-
val (toOutput, newBuffer) = extractLines(buffer, chunk)
135-
Pull.output(toOutput) >> go(newBuffer)(h)
134+
val (toOutput, newBuffer, newPendingLineFeed) = extractLines(buffer, chunk, pendingLineFeed)
135+
Pull.output(toOutput) >> go(newBuffer, newPendingLineFeed)(h)
136136
case None if buffer.nonEmpty => Pull.output1(buffer.mkString)
137137
case None => Pull.done
138138
}(_)
139139
}
140-
_.pull(go(Vector.empty))
140+
_.pull(go(Vector.empty, false))
141141
}
142142
}

core/src/test/scala/fs2/TextSpec.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ class TextSpec extends Fs2Spec {
180180
if (lines.toList.nonEmpty) {
181181
val s = lines.intersperse("\r\n").toList.mkString.grouped(3).toList
182182
Stream.emits(s).throughPure(text.lines).toList shouldBe lines.toList
183+
Stream.emits(s).unchunk.throughPure(text.lines).toList shouldBe lines.toList
183184
}
184185
}
185186
}

0 commit comments

Comments
 (0)