2021-01-15 12:15:29 +03:00
|
|
|
type Tree = Empty | Node
|
2021-01-15 11:09:38 +03:00
|
|
|
|
2021-01-15 12:15:29 +03:00
|
|
|
struct Empty {}
|
2021-01-15 11:09:38 +03:00
|
|
|
|
|
|
|
struct Node {
|
|
|
|
value int
|
|
|
|
left Tree
|
|
|
|
right Tree
|
|
|
|
}
|
|
|
|
|
|
|
|
// NB: a match expression, infers the type of its result
|
|
|
|
// from the type of the return value in the first branch,
|
|
|
|
// => it needs an explicit int(0) cast here:
|
|
|
|
fn size(tree Tree) int {
|
|
|
|
return match tree {
|
2021-01-15 12:15:29 +03:00
|
|
|
Empty { int(0) }
|
2021-01-15 11:09:38 +03:00
|
|
|
Node { 1 + size(tree.left) + size(tree.right) }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
2021-01-15 12:15:29 +03:00
|
|
|
node1 := Node{30, Empty{}, Empty{}}
|
|
|
|
node2 := Node{20, Empty{}, Empty{}}
|
2021-01-15 11:09:38 +03:00
|
|
|
tree := Node{10, node1, node2}
|
|
|
|
println('tree structure:\n $tree')
|
|
|
|
println('tree size: ${size(tree)}')
|
|
|
|
}
|