///|
fn[N] split_leftmost(t : Tree[N]) -> ((N, N), Tree[N]) {
  match t {
    Empty => panic()
    Node(left=Empty, right~, min~, max~, ..) => ((min, max), right)
    Node(..) as t => {
      let ((min, max), l) = split_leftmost(t.left)
      ((min, max), make_node(t.min, t.max, l, t.right))
    }
  }
}

///|
fn[N] split_rightmost(t : Tree[N]) -> ((N, N), Tree[N]) {
  match t {
    Empty => panic()
    Node(left~, right=Empty, min~, max~, ..) => ((min, max), left)
    Node(..) as t => {
      let ((min, max), r) = split_rightmost(t.right)
      ((min, max), make_node(t.min, t.max, t.left, r))
    }
  }
}