108: Add a exercise for a labeled switch

This commit is contained in:
Nuno Mendes 2024-09-15 20:14:49 +02:00
parent 102ba8c894
commit 335a78f8f5
2 changed files with 40 additions and 0 deletions

View file

@ -1197,6 +1197,12 @@ const exercises = [_]Exercise{
\\Successfully Read 18 bytes: It's zigling time!
,
},
.{
.main_file = "108_labeled_switch.zig",
.output =
\\The pull request has been merged
,
},
.{
.main_file = "999_the_end.zig",
.output =

View file

@ -0,0 +1,34 @@
//
// A labeled switch in zig allows the usage of continue and break
// just like loops, these allow you to create very concise
// Finite State Automata to represent state transitions
//
// foo: switch (state) {
// 1 => continue :foo 2,
// 2 => continue :foo 3,
// 3 => return,
// 4 => {},
// ...
// }
//
const std = @import("std");
const PullRequestState = enum {
Draft,
InReview,
Approved,
Rejected,
Merged,
};
pub fn main() void {
// Something is wrong, it seems your Pull Request can never be merged
// try to fix it!
pr: switch (@as(PullRequestState, PullRequestState.Draft)) {
PullRequestState.Draft => continue :pr PullRequestState.InReview,
PullRequestState.InReview => continue :pr PullRequestState.Rejected,
PullRequestState.Approved => continue :pr PullRequestState.Merged,
PullRequestState.Rejected => std.debug.print("The pull request has been rejected", .{}),
PullRequestState.Merged => std.debug.print("The pull request has been merged", .{}),
}
}