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