union Option<T> {
  none
  just(T)
}

fun after<T,U>(o : Option<T>, f : fn (T) -> U) {
  switch o {
    case none { @none<U> }
    case just(x) { just(f(x)) }
  }
}

fun default<T>(o : Option<T>, y : T) {
  switch o {
    case none { y }
    case just(x) { x }
  }
}