ziter icon indicating copy to clipboard operation
ziter copied to clipboard

The missing iterators for Zig

ziter

An iterator library for zig inspired by the iterators in the Rust standard libary.

const iter = @import("ziter");
const std = @import("std");

test "ascii" {
    const ascii_digits = iter.range(u8, 0, 255)
        .filter({}, iter.void_ctx(std.ascii.isDigit));

    const ascii_alpha = try iter.range(u8, 0, 255)
        .filter({}, iter.void_ctx(std.ascii.isAlphabetic))
        .collect_no_allocator(std.BoundedArray(u8, 255){});

    try iter.expectEqual(iter.deref("0123456789"), ascii_digits);
    try std.testing.expectEqualStrings(
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
        ascii_alpha.slice(),
    );
}

test "Fibonacci" {
    const fib = Fibonacci{};

    const fib_sum_first_5 = fib.take(5).sum(usize);
    const fib_first_alphabetic = fib.map({}, to_u8)
        .find({}, iter.void_ctx(std.ascii.isAlphabetic));

    try std.testing.expectEqual(@as(usize, 7), fib_sum_first_5);
    try std.testing.expectEqual(@as(?u8, 'Y'), fib_first_alphabetic);
}

pub const Fibonacci = struct {
    c: usize = 0,
    n: usize = 1,

    pub fn next(it: *@This()) ?usize {
        const curr = it.c;
        it.c = it.n;
        it.n = curr + it.n;
        return curr;
    }

    pub usingnamespace iter;
};

fn to_u8(_: void, item: usize) u8 {
    return @truncate(item);
}