sig
  type ('a, 'm) fg
  type ('wrapped_type, 'a, 'm) wrap =
      monoid:'m monoid -> measure:('-> 'm) -> 'wrapped_type
  val empty : ('a, 'm) fg
  val singleton : '-> ('a, 'm) fg
  val cons : (('a, 'm) fg -> '-> ('a, 'm) fg, 'a, 'm) wrap
  val snoc : (('a, 'm) fg -> '-> ('a, 'm) fg, 'a, 'm) wrap
  val front : (('a, 'm) fg -> (('a, 'm) fg * 'a) option, 'a, 'm) wrap
  val front_exn : (('a, 'm) fg -> ('a, 'm) fg * 'a, 'a, 'm) wrap
  val head : ('a, 'm) fg -> 'a option
  val head_exn : ('a, 'm) fg -> 'a
  val last : ('a, 'm) fg -> 'a option
  val last_exn : ('a, 'm) fg -> 'a
  val tail : (('a, 'm) fg -> ('a, 'm) fg option, 'a, 'm) wrap
  val tail_exn : (('a, 'm) fg -> ('a, 'm) fg, 'a, 'm) wrap
  val init : (('a, 'm) fg -> ('a, 'm) fg option, 'a, 'm) wrap
  val init_exn : (('a, 'm) fg -> ('a, 'm) fg, 'a, 'm) wrap
  val rear : (('a, 'm) fg -> (('a, 'm) fg * 'a) option, 'a, 'm) wrap
  val rear_exn : (('a, 'm) fg -> ('a, 'm) fg * 'a, 'a, 'm) wrap
  val size : ('a, 'm) fg -> int
  val is_empty : ('a, 'm) fg -> bool
  val fold_left : ('acc -> '-> 'acc) -> 'acc -> ('a, 'm) fg -> 'acc
  val fold_right : ('acc -> '-> 'acc) -> 'acc -> ('a, 'm) fg -> 'acc
  val iter : ('-> unit) -> ('a, 'm) fg -> unit
  val iter_right : ('-> unit) -> ('a, 'm) fg -> unit
  val compare : ('-> '-> int) -> ('a, 'm) fg -> ('a, 'm) fg -> int
  val equal : ('-> '-> bool) -> ('a, 'm) fg -> ('a, 'm) fg -> bool
  val enum : ('a, 'm) fg -> 'BatEnum.t
  val backwards : ('a, 'm) fg -> 'BatEnum.t
  val to_list : ('a, 'm) fg -> 'a list
  val to_list_backwards : ('a, 'm) fg -> 'a list
  val of_enum : ('BatEnum.t -> ('a, 'm) fg, 'a, 'm) wrap
  val of_backwards : ('BatEnum.t -> ('a, 'm) fg, 'a, 'm) wrap
  val of_list : ('a list -> ('a, 'm) fg, 'a, 'm) wrap
  val of_list_backwards : ('a list -> ('a, 'm) fg, 'a, 'm) wrap
  val map : (('-> 'b) -> ('a, 'm) fg -> ('b, 'm) fg, 'b, 'm) wrap
  val map_right : (('-> 'b) -> ('a, 'm) fg -> ('b, 'm) fg, 'b, 'm) wrap
  val append : (('a, 'm) fg -> ('a, 'm) fg -> ('a, 'm) fg, 'a, 'm) wrap
  val reverse : (('a, 'm) fg -> ('a, 'm) fg, 'a, 'm) wrap
  val print :
    ?first:string ->
    ?last:string ->
    ?sep:string -> ('a, 'b) BatIO.printer -> (('a, 'c) fg, 'b) BatIO.printer
  val lookup : (('-> bool) -> ('a, 'm) fg -> 'a, 'a, 'm) wrap
  val measure : (('a, 'm) fg -> 'm, 'a, 'm) wrap
  val split :
    (('-> bool) -> ('a, 'm) fg -> ('a, 'm) fg * ('a, 'm) fg, 'a, 'm) wrap
end