import Tree.*;
class Tree {
case Empty;
case Branch(A elem, Tree left, Tree right);
public boolean contains((A, A) -> boolean less, A x) {
switch (this) {
case Empty:
return false;
case Branch(A elem, Tree l, Tree r):
if (less(x, elem))
return l.contains(less, x);
else if (less(elem, x))
return r.contains(less, x);
else
return true;
}
}
public Tree insert((A, A) -> boolean less, A x) {
switch (this) {
case Empty:
return Branch(x, Empty, Empty);
case Branch(A elem, Tree l, Tree r):
if (less(x, elem))
return Branch(elem, l.insert(less, x), r);
else if (less(elem, x))
return Branch(elem, l, r.insert(less, x));
else
return this;
}
}
Tree goRight() {
switch (this) {
case Empty:
return this;
case Branch(_, _, Tree r):
return r.goRight();
}
}
}
public class Test {
public static void main(String[] args) {
Tree t = Branch(2,
Branch(1, Empty, Empty),
Branch(3, Empty, Empty));
t.insert(fun(int a, int b) -> boolean { return a < b; }, 4);
}
}