Iterator Example
Borrowed insertion-order iterator with peek, skip, reset, and collect (no allocation; deinit is a no-op).
Source Code
zig
const std = @import("std");
const Io = std.Io;
const envMod = @import("env");
pub fn main(init: std.process.Init) !void {
const io = init.io;
const allocator = init.gpa;
var env = envMod.Env.init(allocator, .{});
defer env.deinit();
try env.parseString(
\\APP_NAME=myapp
\\PORT=8080
\\DEBUG=true
\\LOG_LEVEL=info
\\DATABASE_URL=postgres://localhost/mydb
\\
);
var stdoutBuffer: [0x100]u8 = undefined;
var stdoutWriter = Io.File.stdout().writer(io, &stdoutBuffer);
const stdout = &stdoutWriter.interface;
try stdout.print("=== Iterator Example ===\n\n", .{});
// Basic iteration with keys() — no allocation
try stdout.print("All entries (via keys):\n", .{});
for (env.keys()) |key| {
try stdout.print(" {s} = {s}\n", .{ key, env.get(key).? });
}
// Iterator API — borrowed, no allocation; deinit is a no-op.
try stdout.print("\nAll entries (via iterator):\n", .{});
var it = env.iterator();
defer it.deinit();
while (it.next()) |entry| {
try stdout.print(" {s} = {s}\n", .{ entry.key, entry.value });
}
// Peek without consuming
var it2 = env.iterator();
defer it2.deinit();
if (it2.peek()) |entry| {
try stdout.print("\nPeek first: {s} = {s}\n", .{ entry.key, entry.value });
}
if (it2.peek()) |entry| {
try stdout.print("Peek again: {s} = {s}\n", .{ entry.key, entry.value });
}
// Skip entries
var it3 = env.iterator();
defer it3.deinit();
try stdout.print("\nRemaining before skip: {d}\n", .{it3.remaining()});
it3.skip(2);
try stdout.print("Remaining after skip(2): {d}\n", .{it3.remaining()});
if (it3.next()) |entry| {
try stdout.print("Next after skip: {s} = {s}\n", .{ entry.key, entry.value });
}
// Reset iterator
var it4 = env.iterator();
defer it4.deinit();
_ = it4.next();
_ = it4.next();
it4.reset();
try stdout.print("\nAfter reset, next: {s}\n", .{(it4.next() orelse unreachable).key});
try stdout.print("\nTotal entries: {d}\n", .{env.count()});
try stdout.flush();
}Running
bash
zig-out/bin/iterator_exampleExample Output
env
=== Iterator Example ===
All entries (via keys):
APP_NAME = myapp
PORT = 8080
DEBUG = true
LOG_LEVEL = info
DATABASE_URL = postgres://localhost/mydb
All entries (via iterator):
APP_NAME = myapp
PORT = 8080
DEBUG = true
LOG_LEVEL = info
DATABASE_URL = postgres://localhost/mydb
Peek first: APP_NAME = myapp
Peek again: APP_NAME = myapp
Remaining before skip: 5
Remaining after skip(2): 3
Next after skip: DEBUG = true
After reset, next: APP_NAME
Total entries: 5Before / After
The iterated store (unchanged by iteration):
env
APP_NAME=myapp
PORT=8080
DEBUG=true
LOG_LEVEL=info
DATABASE_URL=postgres://localhost/mydbIterator cursor states observed:
env
# fresh iterator
remaining=5
# after skip(2)
remaining=3
# after reset
next=APP_NAMESee Also
- Iterator Guide for usage details
- API Reference for the full API
