Теперь вот принесли статью с примерами по случаю этого события:
https://andrewkelley.me/post/zig-new-async-io-text-version.html
Скопирую оттуда седьмой пример:
fn juicyMain(gpa: Allocator, io: Io) !void {
var a = io.async(doWork, .{ gpa, io, "hard" });
defer if (a.cancel(io)) |s| gpa.free(s) else |_| {};
var b = io.async(doWork, .{ gpa, io, "on an excuse not to drink Spezi" });
defer if (b.cancel(io)) |s| gpa.free(s) else |_| {};
const a_string = try a.await(io);
const b_string = try b.await(io);
std.debug.print("finished {s}\n", .{a_string});
std.debug.print("finished {s}\n", .{b_string});
}
fn doWork(gpa: Allocator, io: Io, flavor_text: []const u8) ![]u8 {
const copied_string = try gpa.dupe(u8, flavor_text);
std.debug.print("working {s}\n", .{copied_string});
io.sleep(.fromSeconds(1), .awake) catch {};
return copied_string;
}Как вы думаете в какой последовательности что будет выведено не подглядывая? Копировать ответ не собираюсь.
С чем я согласен: с тем, что надо понимать зависимости между продьюсером данных и тем, кто их вычитывает. Так же как и то, что IO должно быть передано как параметр, но вот выносить реализацию за пределы stdlib и не иметь реализацию в ней - это перебор.
Заглядывая в будущее: Zig - следующий шаг сделать монаду Reader.