---
source: crates/wolf_parser/tests/parser.rs
expression: result.dump
---
file
doc! " A binary search tree: a recursive enum, `own self` and `match own`, recursion."
module main
(section imports (import std.string))
section types
enum
doc " Recursive through the enum; the Rust backend adds `Box` (chapter 4, section 7.4)."
Tree
(variant Leaf)
(variant Node (tuple Tree Int Tree))
section impl
impl
Tree
fn
doc " Consumes the tree and returns a new one that also holds `value`."
insert
(params own self (value Int))
(-> Tree)
block
match
(own self)
(=> Tree.Leaf (call (. Tree Node) (. Tree Leaf) value (. Tree Leaf)))
=>
(Tree.Node left v right)
if
(< value v)
(block (call (. Tree Node) (call (. left insert) value) v right))
(else (block (call (. Tree Node) left v (call (. right insert) value))))
fn
contains
(params self (value Int))
(-> Bool)
block
match
self
(=> Tree.Leaf false)
=>
(Tree.Node left v right)
if
(== value v)
(block true)
else
if
(< value v)
(block (call (. left contains) value))
(else (block (call (. right contains) value)))
fn
doc " Appends the values in ascending order."
collect
(params self (mut out (List Int)))
block
match
self
(=> Tree.Leaf ())
=>
(Tree.Node left v right)
block
(call (. left collect) (mut out))
(call (. out push) v)
(call (. right collect) (mut out))
fn
depth
(params self)
(-> Int)
block
match
self
(=> Tree.Leaf 0)
=>
(Tree.Node left _ right)
(+ 1 (call (. (call (. left depth)) max) (call (. right depth))))
section main
fn
main
()
block
(var tree (. Tree Leaf))
(for value (list 50 30 70 20 40 60 80 35) (block (= tree (call (. tree insert) value))))
(var sorted (List Int) [])
(call (. tree collect) (mut sorted))
(call print (+ "in order: " (call join_ints sorted)))
(call print (+ "depth: " (call (. (call (. tree depth)) to_string))))
(call print (+ "contains 35: " (call (. (call (. tree contains) 35) to_string))))
(call print (+ "contains 36: " (call (. (call (. tree contains) 36) to_string))))
section functions
fn
join_ints
(params (values (List Int)))
(-> String)
block
call
(. string join)
(call (. values map) (closure (params v) (call (. v to_string))))
", "
section tests
test
"values come out sorted"
block
(var tree (. Tree Leaf))
(for value (list 3 1 2) (block (= tree (call (. tree insert) value))))
(var out (List Int) [])
(call (. tree collect) (mut out))
(call assert (== out (list 1 2 3)))