std.Io.async 返回类型化 Future;std.Io.Group 等待一组扇出任务; std.Io.Select 等待任务集合中的下一个结果。取消请求必须在释放任务 拥有的资源前完成 join。

//! Combine Io async, groups, select, and cancellation.

const std = @import("std");

const RaceResult = union(enum) {
    fast: u32,
    slow: u32,
};

pub fn main(init: std.process.Init) !void {
    const io = init.io;
    const stdout = std.Io.File.stdout();

    var future = std.Io.async(io, add, .{ 20, 22 });
    const sum = future.await(io);

    var group: std.Io.Group = .init;
    group.async(io, groupWorker, .{ io, 1 });
    group.async(io, groupWorker, .{ io, 2 });
    try group.await(io);

    var result_buffer: [2]RaceResult = undefined;
    var select = std.Io.Select(RaceResult).init(io, &result_buffer);
    select.async(.fast, fastResult, .{});
    select.async(.slow, slowResult, .{});
    const winner = try select.await();
    select.cancelDiscard();

    var writer_buffer: [256]u8 = undefined;
    var writer = stdout.writer(io, &writer_buffer);
    try writer.interface.print("future sum: {d}\n", .{sum});
    switch (winner) {
        .fast => |value| try writer.interface.print("select winner: fast {d}\n", .{value}),
        .slow => |value| try writer.interface.print("select winner: slow {d}\n", .{value}),
    }
    try writer.interface.flush();
}

fn add(left: u32, right: u32) u32 {
    return left + right;
}

fn groupWorker(io: std.Io, worker_id: u32) std.Io.Cancelable!void {
    std.debug.assert(worker_id > 0);
    try io.checkCancel();
}

fn fastResult() u32 {
    return 1;
}

fn slowResult() u32 {
    return 2;
}