aboutsummaryrefslogtreecommitdiff
path: root/src/filter.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/filter.zig')
-rw-r--r--src/filter.zig22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/filter.zig b/src/filter.zig
new file mode 100644
index 0000000..b9e2167
--- /dev/null
+++ b/src/filter.zig
@@ -0,0 +1,22 @@
+const std = @import("std");
+const typeVerify = @import("util.zig").typeVerify;
+
+/// ```zig
+/// (fn (fn (fn (a) bool, []a) []a)
+/// ```
+/// Filters a slice, only keeping items give `true` when passed into `func`
+/// Type signature: `(a -> bool) -> [a] -> [a]`
+/// `func` is of type `a -> bool`, where `items` is of type `[a]`
+pub fn filter(
+ func: anytype,
+ items: []typeVerify(@TypeOf(func), .{ .@"fn" }).@"fn".params[0].type.?,
+) []typeVerify(@TypeOf(func), .{ .@"fn" }).@"fn".params[0].type.? {
+ var output = items;
+ var i: u32 = 0;
+ for (items) |it|
+ if (func(it)) {
+ output[i] = it;
+ i = i + 1;
+ };
+ return output[0..i];
+}