aboutsummaryrefslogtreecommitdiff
path: root/src/fold.zig
diff options
context:
space:
mode:
authorNic Gaffney <gaffney_nic@protonmail.com>2025-10-28 20:55:06 -0500
committerNic Gaffney <gaffney_nic@protonmail.com>2025-10-28 20:55:06 -0500
commit813b6631de7aa296c23e2471589d66625aa6ce15 (patch)
treebfe69e1d47e97dfe95ff22a6e23b5b46680146f7 /src/fold.zig
parent99c32737fe07bf7dc6094a1326be418ffd00e36f (diff)
downloadfuncz-813b6631de7aa296c23e2471589d66625aa6ce15.tar.gz
scanl added, refactored mapHEADmain
Diffstat (limited to 'src/fold.zig')
-rw-r--r--src/fold.zig21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/fold.zig b/src/fold.zig
index ddaf0a9..f967cdf 100644
--- a/src/fold.zig
+++ b/src/fold.zig
@@ -50,3 +50,24 @@ pub fn foldr1(
) typeVerify(@TypeOf(func), .{ .@"fn" }).@"fn".return_type.? {
return foldr(func, items[0], items);
}
+
+pub fn scanlAlloc(
+ allocator: std.mem.Allocator,
+ comptime func: anytype,
+ base: (typeVerify(@TypeOf(func), .{.@"fn"}).@"fn".params[0].type.?),
+ items: ([]typeVerify(@TypeOf(func), .{.@"fn"}).@"fn".params[1].type.?)
+) ![]typeVerify(@TypeOf(func), .{.@"fn"}).@"fn".return_type.? {
+ var output = try allocator.alloc(typeVerify(@TypeOf(func), .{.@"fn"}).@"fn".return_type.?, items.len);
+ scanlBuffer(func, base, items, &output);
+ return output;
+}
+
+pub fn scanlBuffer(
+ comptime func: anytype,
+ base: (typeVerify(@TypeOf(func), .{.@"fn"}).@"fn".params[0].type.?),
+ items: ([]typeVerify(@TypeOf(func), .{.@"fn"}).@"fn".params[1].type.?),
+ buffer: (*[]typeVerify(@TypeOf(func), .{.@"fn"}).@"fn".return_type.?),
+) void {
+ for (buffer.*, 0..) |*out, i|
+ out.* = foldl(func, base, items[0..i+1]);
+}