// SPDX-FileCopyrightText: 2024 Himbeer // // SPDX-License-Identifier: AGPL-3.0-or-later pub fn Filter(comptime T: type, comptime U: type) type { return struct { pub const Predicate = *const fn (T, U) bool; buffer: []const T, index: ?usize, predicate: Predicate, matcher: U, const Self = @This(); pub fn new(buffer: []const T, predicate: Predicate, matcher: U) Self { return .{ .buffer = buffer, .index = 0, .predicate = predicate, .matcher = matcher, }; } pub fn next(self: *Self) ?T { const start = self.index orelse return null; const index = for (self.buffer[start..], 0..) |elem, skipped| { if (self.predicate(elem, self.matcher)) { break start + skipped; } } else null; if (index) |i| { self.index = if (1 + i < self.buffer.len) 1 + i else null; return self.buffer[i]; } self.index = null; return null; } pub fn reset(self: *Self) void { self.index = 0; } }; }