module Option

/*
  Optional values. `none` represents absence; `just(x)` represents a
  present value.
*/

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

// Map a function over a present optional value.
fun after<T,U>(o : Option<T>, f : fn (T) -> U) {
  switch o {
    case none { @none<U> }
    case just(x) { just(f(x)) }
  }
}

// Return the contained value, or the supplied default when it is absent.
fun default<T>(o : Option<T>, y : T) {
  switch o {
    case none { y }
    case just(x) { x }
  }
}