sig
  module M :
    sig
      type 'a t = 'a option
      val may : ('a -> unit) -> 'a option -> unit
      val map : ('a -> 'b) -> 'a option -> 'b option
      val bind : ('a -> 'b option) -> 'a option -> 'b option
      val apply : ('a -> 'a) option -> 'a -> 'a
      val default : 'a -> 'a option -> 'a
      val ( |? ) : 'a option -> 'a -> 'a
      val map_default : ('a -> 'b) -> 'b -> 'a option -> 'b
      val is_none : 'a option -> bool
      val is_some : 'a option -> bool
      val get : 'a option -> 'a
      val get_exn : 'a option -> exn -> 'a
      val compare : ?cmp:('a -> 'a -> int) -> 'a option -> 'a option -> int
      val eq : ?eq:('a -> 'a -> bool) -> 'a option -> 'a option -> bool
      val enum : 'a option -> 'a BatEnum.t
      val of_enum : 'a BatEnum.t -> 'a option
      module Monad :
        sig
          type 'a m = 'a option
          val return : 'a -> 'a m
          val bind : 'a m -> ('a -> 'b m) -> 'b m
        end
      val print :
        ('a BatInnerIO.output -> 'b -> unit) ->
        'a BatInnerIO.output -> 'b t -> unit
      val t_printer : 'a BatValuePrinter.t -> 'a t BatValuePrinter.t
      val maybe_printer : 'a BatValuePrinter.t -> 'a t BatValuePrinter.t
      module Labels :
        sig
          val may : f:('a -> unit) -> 'a option -> unit
          val map : f:('a -> 'b) -> 'a option -> 'b option
          val map_default : f:('a -> 'b) -> 'b -> 'a option -> 'b
        end
      module Infix : sig val ( |? ) : 'a option -> 'a -> 'a end
      val may : f:('a -> unit) -> 'a option -> unit
      val map : f:('a -> 'b) -> 'a option -> 'b option
      val map_default : f:('a -> 'b) -> 'b -> 'a option -> 'b
    end
  module With_monad :
    sig
      type 'a t = 'a option
      val may : ('a -> unit) -> 'a option -> unit
      val map : ('a -> 'b) -> 'a option -> 'b option
      val bind : ('a -> 'b option) -> 'a option -> 'b option
      val apply : ('a -> 'a) option -> 'a -> 'a
      val default : 'a -> 'a option -> 'a
      val ( |? ) : 'a option -> 'a -> 'a
      val map_default : ('a -> 'b) -> 'b -> 'a option -> 'b
      val is_none : 'a option -> bool
      val is_some : 'a option -> bool
      val get : 'a option -> 'a
      val get_exn : 'a option -> exn -> 'a
      val compare : ?cmp:('a -> 'a -> int) -> 'a option -> 'a option -> int
      val eq : ?eq:('a -> 'a -> bool) -> 'a option -> 'a option -> bool
      val enum : 'a option -> 'a BatEnum.t
      val of_enum : 'a BatEnum.t -> 'a option
      module Monad :
        sig
          type 'a m = 'a option
          val return : 'a -> 'a m
          val bind : 'a m -> ('a -> 'b m) -> 'b m
        end
      val print :
        ('a BatInnerIO.output -> 'b -> unit) ->
        'a BatInnerIO.output -> 'b t -> unit
      val t_printer : 'a BatValuePrinter.t -> 'a t BatValuePrinter.t
      val maybe_printer : 'a BatValuePrinter.t -> 'a t BatValuePrinter.t
      module Labels :
        sig
          val may : f:('a -> unit) -> 'a option -> unit
          val map : f:('a -> 'b) -> 'a option -> 'b option
          val map_default : f:('a -> 'b) -> 'b -> 'a option -> 'b
        end
      module Infix : sig val ( |? ) : 'a option -> 'a -> 'a end
      val may : f:('a -> unit) -> 'a option -> unit
      val map : f:('a -> 'b) -> 'a option -> 'b option
      val map_default : f:('a -> 'b) -> 'b -> 'a option -> 'b
      type 'a m = 'a option
      val return : 'a -> 'a m
      val bind : 'a m -> ('a -> 'b m) -> 'b m
      val ( >>= ) : 'a m -> ('a -> 'b m) -> 'b m
    end
  type 'a t = 'a option
  val may : ('a -> unit) -> 'a option -> unit
  val map : ('a -> 'b) -> 'a option -> 'b option
  val bind : ('a -> 'b option) -> 'a option -> 'b option
  val apply : ('a -> 'a) option -> 'a -> 'a
  val default : 'a -> 'a option -> 'a
  val ( |? ) : 'a option -> 'a -> 'a
  val map_default : ('a -> 'b) -> 'b -> 'a option -> 'b
  val is_none : 'a option -> bool
  val is_some : 'a option -> bool
  val get : 'a option -> 'a
  val get_exn : 'a option -> exn -> 'a
  val compare : ?cmp:('a -> 'a -> int) -> 'a option -> 'a option -> int
  val eq : ?eq:('a -> 'a -> bool) -> 'a option -> 'a option -> bool
  val enum : 'a option -> 'a BatEnum.t
  val of_enum : 'a BatEnum.t -> 'a option
  module Monad :
    sig
      type 'a m = 'a option
      val return : 'a -> 'a m
      val bind : 'a m -> ('a -> 'b m) -> 'b m
    end
  val print :
    ('a BatInnerIO.output -> 'b -> unit) ->
    'a BatInnerIO.output -> 'b t -> unit
  val t_printer : 'a BatValuePrinter.t -> 'a t BatValuePrinter.t
  val maybe_printer : 'a BatValuePrinter.t -> 'a t BatValuePrinter.t
  module Labels :
    sig
      val may : f:('a -> unit) -> 'a option -> unit
      val map : f:('a -> 'b) -> 'a option -> 'b option
      val map_default : f:('a -> 'b) -> 'b -> 'a option -> 'b
    end
  module Infix : sig val ( |? ) : 'a option -> 'a -> 'a end
  val may : f:('a -> unit) -> 'a option -> unit
  val map : f:('a -> 'b) -> 'a option -> 'b option
  val map_default : f:('a -> 'b) -> 'b -> 'a option -> 'b
end