aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/examples/lander.v
diff options
context:
space:
mode:
Diffstat (limited to 'v_windows/v/examples/lander.v')
-rw-r--r--v_windows/v/examples/lander.v62
1 files changed, 62 insertions, 0 deletions
diff --git a/v_windows/v/examples/lander.v b/v_windows/v/examples/lander.v
new file mode 100644
index 0000000..ad2600d
--- /dev/null
+++ b/v_windows/v/examples/lander.v
@@ -0,0 +1,62 @@
+// Example of sum types
+// Models a landing craft leaving orbit and landing on a world
+import rand
+import time
+
+struct Moon {
+}
+
+struct Mars {
+}
+
+fn (m Mars) dust_storm() bool {
+ return rand.int() >= 0
+}
+
+struct Venus {
+}
+
+type World = Mars | Moon | Venus
+
+struct Lander {
+}
+
+fn (l Lander) deorbit() {
+ println('leaving orbit')
+}
+
+fn (l Lander) open_parachutes(n int) {
+ println('opening $n parachutes')
+}
+
+fn wait() {
+ println('waiting...')
+ time.sleep(1 * time.second)
+}
+
+fn (l Lander) land(w World) {
+ if w is Mars {
+ for w.dust_storm() {
+ wait()
+ }
+ }
+ l.deorbit()
+ match w {
+ Moon {} // no atmosphere
+ Mars {
+ // light atmosphere
+ l.open_parachutes(3)
+ }
+ Venus {
+ // heavy atmosphere
+ l.open_parachutes(1)
+ }
+ }
+ println('landed')
+}
+
+fn main() {
+ l := Lander{}
+ l.land(Venus{})
+ l.land(Mars{})
+}