Skip to content

Commit ad9660f

Browse files
quakebobzhang
authored andcommitted
refactor: array chunk should return view
1 parent 98601ef commit ad9660f

File tree

2 files changed

+22
-23
lines changed

2 files changed

+22
-23
lines changed

builtin/array.mbt

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1444,19 +1444,18 @@ pub fn[T] Array::extract_if(self : Array[T], f : (T) -> Bool) -> Array[T] {
14441444
/// let arr : Array[Int] = []
14451445
/// inspect(arr.chunks(3), content="[]")
14461446
/// ```
1447-
pub fn[T] Array::chunks(self : Array[T], size : Int) -> Array[Array[T]] {
1447+
pub fn[T] Array::chunks(self : Array[T], size : Int) -> Array[ArrayView[T]] {
14481448
guard size > 0
1449-
let chunks = []
1450-
let mut i = 0
1451-
while i < self.length() {
1452-
let chunk = Array::new(capacity=size)
1453-
for j = 0; j < size && i < self.length(); j = j + 1 {
1454-
chunk.push(self[i])
1455-
i = i + 1
1456-
}
1457-
chunks.push(chunk)
1449+
let len = self.length()
1450+
if len == 0 {
1451+
return []
14581452
}
1459-
chunks
1453+
let num_chunks = (len + size - 1) / size
1454+
Array::makei(num_chunks, i => {
1455+
let start = i * size
1456+
let end = Int::min(start + size, len)
1457+
self[start:end]
1458+
})
14601459
}
14611460
14621461
///|
@@ -1486,19 +1485,19 @@ pub fn[T] Array::chunks(self : Array[T], size : Int) -> Array[Array[T]] {
14861485
pub fn[T] Array::chunk_by(
14871486
self : Array[T],
14881487
pred : (T, T) -> Bool raise?,
1489-
) -> Array[Array[T]] raise? {
1488+
) -> Array[ArrayView[T]] raise? {
14901489
let chunks = []
1491-
let mut i = 0
1492-
while i < self.length() {
1493-
let chunk = []
1494-
chunk.push(self[i])
1495-
i = i + 1
1496-
while i < self.length() && pred(self[i - 1], self[i]) {
1497-
chunk.push(self[i])
1498-
i = i + 1
1490+
if self.is_empty() {
1491+
return chunks
1492+
}
1493+
let mut start = 0
1494+
for i in 1..<self.length() {
1495+
if !pred(self[i - 1], self[i]) {
1496+
chunks.push(self[start:i])
1497+
start = i
14991498
}
1500-
chunks.push(chunk)
15011499
}
1500+
chunks.push(self[start:self.length()])
15021501
chunks
15031502
}
15041503

builtin/pkg.generated.mbti

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,8 @@ fn[T : Compare] Array::binary_search(Self[T], T) -> Result[Int, Int]
8282
fn[T] Array::binary_search_by(Self[T], (T) -> Int) -> Result[Int, Int]
8383
fn[A] Array::blit_to(Self[A], Self[A], len~ : Int, src_offset? : Int, dst_offset? : Int) -> Unit
8484
fn[T] Array::capacity(Self[T]) -> Int
85-
fn[T] Array::chunk_by(Self[T], (T, T) -> Bool raise?) -> Self[Self[T]] raise?
86-
fn[T] Array::chunks(Self[T], Int) -> Self[Self[T]]
85+
fn[T] Array::chunk_by(Self[T], (T, T) -> Bool raise?) -> Self[ArrayView[T]] raise?
86+
fn[T] Array::chunks(Self[T], Int) -> Self[ArrayView[T]]
8787
fn[T] Array::clear(Self[T]) -> Unit
8888
fn[T : Compare] Array::compare(Self[T], Self[T]) -> Int // from trait `Compare`
8989
fn[T : Eq] Array::contains(Self[T], T) -> Bool

0 commit comments

Comments
 (0)