struct
  exception No_value of string
  let value o ~default = match o with Some s -> s | None -> default
  let value_exn o ~msg =
    match o with
    | Some o -> o
    | None -> raise (No_value msg)
  let map o ~f =
    match o with
    | None -> None
    | Some s -> Some (f s)
  let value_map o ~default ~f =
    match o with
    | Some s -> f s
    | None -> default
  let return s = Some s
  let bind o ~f = 
    match o with
    | None -> None
    | Some s -> f s
  let (>>=) x f = bind x ~f


end