let unopt = fun ?default v ->
  match v, default with
  | None,   None   -> raise (Invalid_argument "unopt None")
  | None,   Some v -> v
  | Some v, _      -> v