Просмотр исходного кода

108: Add a exercise for a labeled switch

Nuno Mendes 11 месяцев назад
Родитель
Сommit
335a78f8f5
2 измененных файлов с 40 добавлено и 0 удалено
  1. 6 0
      build.zig
  2. 34 0
      exercises/108_labeled_switch.zig

+ 6 - 0
build.zig

@@ -1198,6 +1198,12 @@ const exercises = [_]Exercise{
         ,
     },
     .{
+        .main_file = "108_labeled_switch.zig",
+        .output =
+        \\The pull request has been merged
+        ,
+    },
+    .{
         .main_file = "999_the_end.zig",
         .output =
         \\

+ 34 - 0
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", .{}),
+    }
+}