summaryrefslogtreecommitdiff
path: root/exercises
diff options
context:
space:
mode:
authorChris Boesch <chrboesch@noreply.codeberg.org>2026-04-03 13:35:56 +0200
committerChris Boesch <chrboesch@noreply.codeberg.org>2026-04-03 13:35:56 +0200
commite0259f43a726f61da14686de802021fcdb9aacd0 (patch)
tree57359102e5e898289b91ada2d65ca742ec118c8b /exercises
parentffde357f303e7459a12cfe4b785ae9e8ef9ebe30 (diff)
Insert space for additional async exercises
Diffstat (limited to 'exercises')
-rw-r--r--exercises/090_async7.zig2
-rw-r--r--exercises/091_async8.zig67
-rw-r--r--exercises/095_interfaces.zig (renamed from exercises/092_interfaces.zig)0
-rw-r--r--exercises/096_hello_c.zig (renamed from exercises/093_hello_c.zig)0
-rw-r--r--exercises/097_c_math.zig (renamed from exercises/094_c_math.zig)0
-rw-r--r--exercises/098_for3.zig (renamed from exercises/095_for3.zig)0
-rw-r--r--exercises/099_memory_allocation.zig (renamed from exercises/096_memory_allocation.zig)0
-rw-r--r--exercises/100_bit_manipulation.zig (renamed from exercises/097_bit_manipulation.zig)0
-rw-r--r--exercises/101_bit_manipulation2.zig (renamed from exercises/098_bit_manipulation2.zig)0
-rw-r--r--exercises/102_formatting.zig (renamed from exercises/099_formatting.zig)0
-rw-r--r--exercises/103_for4.zig (renamed from exercises/100_for4.zig)0
-rw-r--r--exercises/104_for5.zig (renamed from exercises/101_for5.zig)0
-rw-r--r--exercises/105_testing.zig (renamed from exercises/102_testing.zig)0
-rw-r--r--exercises/106_tokenization.zig (renamed from exercises/103_tokenization.zig)0
-rw-r--r--exercises/107_threading.zig (renamed from exercises/104_threading.zig)0
-rw-r--r--exercises/108_threading2.zig (renamed from exercises/105_threading2.zig)0
-rw-r--r--exercises/109_files.zig (renamed from exercises/106_files.zig)0
-rw-r--r--exercises/110_files2.zig (renamed from exercises/107_files2.zig)0
-rw-r--r--exercises/111_labeled_switch.zig (renamed from exercises/108_labeled_switch.zig)0
-rw-r--r--exercises/112_vectors.zig (renamed from exercises/109_vectors.zig)0
-rw-r--r--exercises/113_quiz9.zig (renamed from exercises/110_quiz9.zig)0
-rw-r--r--exercises/114_packed.zig (renamed from exercises/111_packed.zig)0
-rw-r--r--exercises/115_packed2.zig (renamed from exercises/112_packed2.zig)0
23 files changed, 48 insertions, 21 deletions
diff --git a/exercises/090_async7.zig b/exercises/090_async7.zig
index f914aef..bfe6ffd 100644
--- a/exercises/090_async7.zig
+++ b/exercises/090_async7.zig
@@ -42,7 +42,7 @@ pub fn main(init: std.process.Init) !void {
try group.await(io);
- print("Counter: {} (expected: 400)\n", .{state.counter});
+ print("Counter: {}\n", .{state.counter});
}
fn increment(io: std.Io, state: *SharedState, times: u32) void {
diff --git a/exercises/091_async8.zig b/exercises/091_async8.zig
index cd9c975..10921c3 100644
--- a/exercises/091_async8.zig
+++ b/exercises/091_async8.zig
@@ -1,35 +1,62 @@
//
-// You have doubtless noticed that 'suspend' requires a block
-// expression like so:
+// Tasks often need to communicate! Io provides Queue for this —
+// a bounded, thread-safe channel for passing data between tasks:
//
-// suspend {}
+// var backing: [16]u32 = undefined;
+// var queue: std.Io.Queue(u32) = .init(&backing);
//
-// The suspend block executes when a function suspends. To get
-// sense for when this happens, please make the following
-// program print the string
+// // Producer task:
+// try queue.putOne(io, value); // blocks if queue is full
//
-// "ABCDEF"
+// // Consumer task:
+// const val = try queue.getOne(io); // blocks if queue is empty
//
-const print = @import("std").debug.print;
+// When the producer is done, it calls queue.close(io) to signal
+// that no more data is coming. After that, getOne() will return
+// error.Closed once the queue is drained.
+//
+// This is the classic producer/consumer pattern — one task
+// generates work, another processes it, and the queue handles
+// all the synchronization automatically.
+//
+// Fix this program: the producer sends numbers 1..10, the
+// consumer sums them up. The expected sum is 55.
+//
+const std = @import("std");
+const print = std.debug.print;
-pub fn main() void {
- print("A", .{});
+pub fn main(init: std.process.Init) !void {
+ const io = init.io;
- var frame = async suspendable();
+ var backing: [4]u32 = undefined;
+ var queue: std.Io.Queue(u32) = .init(&backing);
- print("X", .{});
+ var group: std.Io.Group = .init;
- resume frame;
+ group.async(io, producer, .{ io, &queue });
+ group.async(io, consumer, .{ io, &queue });
- print("F", .{});
+ try group.await(io);
}
-fn suspendable() void {
- print("X", .{});
-
- suspend {
- print("X", .{});
+fn producer(io: std.Io, queue: *std.Io.Queue(u32)) void {
+ // Send numbers 1 through 10 into the queue.
+ for (1..11) |i| {
+ // What Queue method sends a single element, blocking if full?
+ queue.???(io, @intCast(i)) catch return;
}
+ // Signal that we're done sending.
+ queue.close(io);
+}
- print("X", .{});
+fn consumer(io: std.Io, queue: *std.Io.Queue(u32)) void {
+ var sum: u32 = 0;
+ while (true) {
+ const value = queue.getOne(io) catch |err| switch (err) {
+ error.Closed => break,
+ error.Canceled => return,
+ };
+ sum += value;
+ }
+ print("Sum of 1..10 = {}\n", .{sum});
}
diff --git a/exercises/092_interfaces.zig b/exercises/095_interfaces.zig
index 7775dd5..7775dd5 100644
--- a/exercises/092_interfaces.zig
+++ b/exercises/095_interfaces.zig
diff --git a/exercises/093_hello_c.zig b/exercises/096_hello_c.zig
index 182e0b0..182e0b0 100644
--- a/exercises/093_hello_c.zig
+++ b/exercises/096_hello_c.zig
diff --git a/exercises/094_c_math.zig b/exercises/097_c_math.zig
index ec59a86..ec59a86 100644
--- a/exercises/094_c_math.zig
+++ b/exercises/097_c_math.zig
diff --git a/exercises/095_for3.zig b/exercises/098_for3.zig
index 77a1b56..77a1b56 100644
--- a/exercises/095_for3.zig
+++ b/exercises/098_for3.zig
diff --git a/exercises/096_memory_allocation.zig b/exercises/099_memory_allocation.zig
index 58de7b0..58de7b0 100644
--- a/exercises/096_memory_allocation.zig
+++ b/exercises/099_memory_allocation.zig
diff --git a/exercises/097_bit_manipulation.zig b/exercises/100_bit_manipulation.zig
index 0e64ad7..0e64ad7 100644
--- a/exercises/097_bit_manipulation.zig
+++ b/exercises/100_bit_manipulation.zig
diff --git a/exercises/098_bit_manipulation2.zig b/exercises/101_bit_manipulation2.zig
index 8b51265..8b51265 100644
--- a/exercises/098_bit_manipulation2.zig
+++ b/exercises/101_bit_manipulation2.zig
diff --git a/exercises/099_formatting.zig b/exercises/102_formatting.zig
index be16978..be16978 100644
--- a/exercises/099_formatting.zig
+++ b/exercises/102_formatting.zig
diff --git a/exercises/100_for4.zig b/exercises/103_for4.zig
index c8a1161..c8a1161 100644
--- a/exercises/100_for4.zig
+++ b/exercises/103_for4.zig
diff --git a/exercises/101_for5.zig b/exercises/104_for5.zig
index 200e71d..200e71d 100644
--- a/exercises/101_for5.zig
+++ b/exercises/104_for5.zig
diff --git a/exercises/102_testing.zig b/exercises/105_testing.zig
index 0dec9b9..0dec9b9 100644
--- a/exercises/102_testing.zig
+++ b/exercises/105_testing.zig
diff --git a/exercises/103_tokenization.zig b/exercises/106_tokenization.zig
index d0abb5c..d0abb5c 100644
--- a/exercises/103_tokenization.zig
+++ b/exercises/106_tokenization.zig
diff --git a/exercises/104_threading.zig b/exercises/107_threading.zig
index 3c3fa21..3c3fa21 100644
--- a/exercises/104_threading.zig
+++ b/exercises/107_threading.zig
diff --git a/exercises/105_threading2.zig b/exercises/108_threading2.zig
index 374391a..374391a 100644
--- a/exercises/105_threading2.zig
+++ b/exercises/108_threading2.zig
diff --git a/exercises/106_files.zig b/exercises/109_files.zig
index bf4de9b..bf4de9b 100644
--- a/exercises/106_files.zig
+++ b/exercises/109_files.zig
diff --git a/exercises/107_files2.zig b/exercises/110_files2.zig
index c363086..c363086 100644
--- a/exercises/107_files2.zig
+++ b/exercises/110_files2.zig
diff --git a/exercises/108_labeled_switch.zig b/exercises/111_labeled_switch.zig
index 897fcf5..897fcf5 100644
--- a/exercises/108_labeled_switch.zig
+++ b/exercises/111_labeled_switch.zig
diff --git a/exercises/109_vectors.zig b/exercises/112_vectors.zig
index 96892ca..96892ca 100644
--- a/exercises/109_vectors.zig
+++ b/exercises/112_vectors.zig
diff --git a/exercises/110_quiz9.zig b/exercises/113_quiz9.zig
index 8f5cb61..8f5cb61 100644
--- a/exercises/110_quiz9.zig
+++ b/exercises/113_quiz9.zig
diff --git a/exercises/111_packed.zig b/exercises/114_packed.zig
index 1058f76..1058f76 100644
--- a/exercises/111_packed.zig
+++ b/exercises/114_packed.zig
diff --git a/exercises/112_packed2.zig b/exercises/115_packed2.zig
index 2b6b558..2b6b558 100644
--- a/exercises/112_packed2.zig
+++ b/exercises/115_packed2.zig