zigar.function.Generator(T).yield(self, value) - chung-leong/zigar GitHub Wiki

Send a value or error to the JavaScript side through the async generator interface. A value of null indicates the end of content generation. If the function returns false, the for async (...) loop on the JavaScript been interrupted and no more values should be sent.

Usage:

const std = @import("std");
const zigar = @import("zigar");

const Generator = zigar.function.Generator(?error{OutOfMemory}![]u8);

pub fn start() !void {
    try zigar.thread.use();
}

pub fn stop() void {
    zigar.thread.end();
}

pub fn getStrings(a: std.mem.Allocator, generator: Generator) !void {
    const thread = try std.Thread.spawn(.{}, generateStrings, .{ a, generator });
    thread.detach();
}

fn generateStrings(a: std.mem.Allocator, generator: Generator) void {
    for (0..10) |i| {
        std.debug.print("generating item {d}\n", .{i});
        if (!generator.yield(std.fmt.allocPrint(a, "string {d}", .{i}))) break;
    } else generator.end();
}
import { getStrings, start, stop } from './generator-example-2.zig';

try {
    start();
    for await (const s of getStrings()) {
        console.log(s.string);
        break;
    }
} finally {
    console.log('finally');
    stop();
}
generating item 0
string 0
generating item 1
finally

Arguments:

  • self: @This()
  • value: T

Return value:

bool


Generator(T)