Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 58 additions & 0 deletions core-tests/shared/src/test/scala/zio/ChunkSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -776,6 +776,64 @@ object ChunkSpec extends ZIOBaseSpec {
assertTrue(vector1 == vector2)
}
}
),
suite("Append")(
test("right only slice of append converted to vector") {
val chunk = Chunk(1, 2) :+ 3 :+ 4
val slice = chunk.slice(2, 4)
assertTrue(slice.toVector == Vector(3, 4))
},
test("right slice of append converted to vector") {
val chunk = Chunk(1, 2, 3) :+ 4 :+ 5 :+ 6
val slice = chunk.slice(4, 6)
assertTrue(slice.toVector == Vector(5, 6))
},
test("left only slice of append converted to vector") {
val chunk = Chunk(1, 2, 3) :+ 4 :+ 5 :+ 6
val slice = chunk.slice(1, 2)
assertTrue(slice.toVector == Vector(2))
},
test("slice of append covering both sides converted to vector") {
val chunk = Chunk(1, 2, 3) :+ 4 :+ 5 :+ 6
val slice = chunk.slice(1, 5)
assertTrue(slice.toVector == Vector(2, 3, 4, 5))
},
test("appended chunks to vector") {
check(Gen.chunkOf(Gen.int), Gen.chunkOf(Gen.int)) { case (chunk1, chunk2) =>
val vector1 = chunk2.foldLeft(chunk1)(_ :+ _).toVector
val vector2 = chunk1.toVector ++ chunk2.toVector
assertTrue(vector1 == vector2)
}
}
),
suite("Prepend")(
test("right only slice of prepend converted to vector") {
val chunk = 1 +: 2 +: Chunk(3, 4)
val slice = chunk.slice(2, 4)
assertTrue(slice.toVector == Vector(3, 4))
},
test("right slice of prepend converted to vector") {
val chunk = 1 +: 2 +: 3 +: Chunk(4, 5, 6)
val slice = chunk.slice(4, 6)
assertTrue(slice.toVector == Vector(5, 6))
},
test("left only slice of prepend converted to vector") {
val chunk = 1 +: 2 +: 3 +: Chunk(4, 5, 6)
val slice = chunk.slice(1, 2)
assertTrue(slice.toVector == Vector(2))
},
test("slice of prepend covering both sides converted to vector") {
val chunk = 1 +: 2 +: 3 +: Chunk(4, 5, 6)
val slice = chunk.slice(1, 5)
assertTrue(slice.toVector == Vector(2, 3, 4, 5))
},
test("prepended chunks to vector") {
check(Gen.chunkOf(Gen.int), Gen.chunkOf(Gen.int)) { case (chunk1, chunk2) =>
val vector1 = chunk1.foldRight(chunk2)(_ +: _).toVector
val vector2 = chunk1.toVector ++ chunk2.toVector
assertTrue(vector1 == vector2)
}
}
)
)
}
15 changes: 7 additions & 8 deletions core/shared/src/main/scala/zio/Chunk.scala
Original file line number Diff line number Diff line change
Expand Up @@ -1436,8 +1436,8 @@ object Chunk extends ChunkFactory with ChunkPlatformSpecific {

override protected[zio] def toArray[A1 >: A](srcPos: Int, dest: Array[A1], destPos: Int, length: Int): Unit = {
val n = math.max(math.min(math.min(length, start.length - srcPos), dest.length - destPos), 0)
start.toArray(srcPos, dest, destPos, n)
Array.copy(buffer.asInstanceOf[Array[A]], math.max(srcPos - n, 0), dest, destPos + n, length - n)
start.toArray(math.min(start.length, srcPos), dest, destPos, n)
Array.copy(buffer, math.max(srcPos - start.length, 0), dest, destPos + n, length - n)
}
}

Expand Down Expand Up @@ -1472,8 +1472,8 @@ object Chunk extends ChunkFactory with ChunkPlatformSpecific {

override protected[zio] def toArray[A1 >: A](srcPos: Int, dest: Array[A1], destPos: Int, length: Int): Unit = {
val n = math.max(math.min(math.min(length, bufferUsed - srcPos), dest.length - destPos), 0)
Array.copy(buffer.asInstanceOf[Array[A]], BufferSize - n, dest, destPos, n)
end.toArray(math.max(srcPos - n, 0), dest, destPos + n, length - n)
Array.copy(buffer, math.min(BufferSize, BufferSize - bufferUsed + srcPos), dest, destPos, n)
end.toArray(math.max(srcPos - bufferUsed, 0), dest, destPos + n, length - n)
}
}

Expand Down Expand Up @@ -1758,10 +1758,9 @@ object Chunk extends ChunkFactory with ChunkPlatformSpecific {
left.iterator ++ right.iterator

override protected[zio] def toArray[A1 >: A](srcPos: Int, dest: Array[A1], destPos: Int, length: Int): Unit = {
val ll = left.length
val n = math.max(math.min(math.min(length, ll - srcPos), dest.length - destPos), 0)
left.toArray(math.min(ll, srcPos), dest, destPos, n)
right.toArray(math.max(srcPos - ll, 0), dest, destPos + n, math.max(length - n, 0))
val n = math.max(math.min(math.min(length, left.length - srcPos), dest.length - destPos), 0)
left.toArray(math.min(left.length, srcPos), dest, destPos, n)
right.toArray(math.max(srcPos - left.length, 0), dest, destPos + n, length - n)
}
}

Expand Down