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
    }
  }
}