summaryrefslogtreecommitdiff
path: root/exercises/108_labeled_switch.zig
diff options
context:
space:
mode:
Diffstat (limited to 'exercises/108_labeled_switch.zig')
-rw-r--r--exercises/108_labeled_switch.zig34
1 files changed, 34 insertions, 0 deletions
diff --git a/exercises/108_labeled_switch.zig b/exercises/108_labeled_switch.zig
new file mode 100644
index 0000000..623e359
--- /dev/null
+++ b/exercises/108_labeled_switch.zig
@@ -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", .{}),
+ }
+}