63 lines
		
	
	
		
			819 B
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			819 B
		
	
	
	
		
			V
		
	
	
// 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{})
 | 
						|
}
 |