Implement List.takeFirst

This commit is contained in:
satotake 2021-11-08 14:10:53 +00:00 committed by GitHub
parent 978f9e0bc6
commit 878400f95f
13 changed files with 145 additions and 1 deletions

View file

@ -862,6 +862,33 @@ pub fn listSwap(
return newList;
}
pub fn listTakeFirst(
list: RocList,
alignment: u32,
element_width: usize,
take_count: usize,
dec: Dec,
) callconv(.C) RocList {
if (list.bytes) |source_ptr| {
if (take_count == 0) {
return RocList.empty();
}
const in_len = list.len();
const out_len = std.math.min(take_count, in_len);
const output = RocList.allocate(alignment, out_len, element_width);
const target_ptr = output.bytes orelse unreachable;
@memcpy(target_ptr, source_ptr, out_len * element_width);
utils.decref(list.bytes, in_len * element_width, alignment);
return output;
} else {
return RocList.empty();
}
}
pub fn listDrop(
list: RocList,
alignment: u32,

View file

@ -45,6 +45,7 @@ comptime {
exportListFn(list.listReverse, "reverse");
exportListFn(list.listSortWith, "sort_with");
exportListFn(list.listConcat, "concat");
exportListFn(list.listTakeFirst, "take_first");
exportListFn(list.listDrop, "drop");
exportListFn(list.listDropAt, "drop_at");
exportListFn(list.listSet, "set");