diff options
Diffstat (limited to 'v_windows/v/examples/lander.v')
-rw-r--r-- | v_windows/v/examples/lander.v | 62 |
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{}) +} |