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

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

define default : (fn <T> (Option<T>, T) -> T) = generic T {
      fun o:Option<T>, y:T {
        switch o {
          case none {
            y
          }
          case just(x) {
            x
          }
        }
      }
    }