diff options
author | Mathias Magnusson <mathias@magnusson.space> | 2025-06-02 15:01:58 +0200 |
---|---|---|
committer | Mathias Magnusson <mathias@magnusson.space> | 2025-06-02 15:16:20 +0200 |
commit | 939ee7606fbfe3afa6b6a008fb617120a6dd8114 (patch) | |
tree | 2bd55979cd3f4531ef83090b99ba296ec7db82c8 /src/peek.zig | |
parent | ef18ba588a4b1531c8b42cbfc996ef6f60de1d97 (diff) | |
download | huginn-939ee7606fbfe3afa6b6a008fb617120a6dd8114.tar.gz |
make Lexer peekable without a wrapper
Diffstat (limited to 'src/peek.zig')
-rw-r--r-- | src/peek.zig | 51 |
1 files changed, 0 insertions, 51 deletions
diff --git a/src/peek.zig b/src/peek.zig deleted file mode 100644 index 58911e9..0000000 --- a/src/peek.zig +++ /dev/null @@ -1,51 +0,0 @@ -pub fn peekable(iterator: anytype) Peekable(@TypeOf(iterator)) { - return .{ .iterator = iterator }; -} - -pub fn Peekable(Iterator: type) type { - const ActualIterator = switch (@typeInfo(Iterator)) { - .pointer => |p| p.child, - else => Iterator, - }; - const Next = @typeInfo(@TypeOf(ActualIterator.next)).@"fn"; - const Item = switch (@typeInfo(Next.return_type.?)) { - .optional => |o| o.child, - else => |i| i, - }; - return struct { - iterator: Iterator, - peeked: ?Item = null, - - pub fn peek(self: *Self) ?Item { - if (self.peeked) |peeked| return peeked; - const item = self.iterator.next(); - self.peeked = item; - return item; - } - - pub fn next(self: *Self) ?Item { - const item = if (self.peeked) |peeked| peeked else self.iterator.next(); - self.peeked = null; - return item; - } - - const Self = @This(); - }; -} - -test peekable { - const expect = std.testing.expect; - // std.meta.de - - var it = std.mem.window(u8, &[_]u8{ 1, 2, 3 }, 1, 1); - var peek = peekable(&it); - try expect(peek.next().?[0] == 1); - try expect(peek.peek().?[0] == 2); - try expect(peek.peek().?[0] == 2); - try expect(peek.next().?[0] == 2); - try expect(peek.next().?[0] == 3); - try expect(peek.peek() == null); - try expect(peek.next() == null); -} - -const std = @import("std"); |