functor
  (B : sig
         type t
         val empty : Functors.t
         val length : Functors.t -> int
         val get : Functors.t -> int -> char
         val make : int -> char -> Functors.t
         val init : int -> f:(int -> char) -> Functors.t
         val compare : Functors.t -> Functors.t -> int
         val concat : sep:Functors.t -> Functors.t list -> Functors.t
         val iter : f:(char -> unit) -> Functors.t -> unit
         val iteri : f:(int -> char -> unit) -> Functors.t -> unit
         val map : f:(char -> char) -> Functors.t -> Functors.t
         val mapi : f:(int -> char -> char) -> Functors.t -> Functors.t
         val index_from : Functors.t -> int -> char -> int
         val rindex_from : Functors.t -> int -> char -> int
         val sub : Functors.t -> pos:int -> len:int -> Functors.t
         val of_buffer : Buffer.t -> Functors.t
         val string_for_output : Functors.t -> string
       end->
  sig
    type character = char
    type t = B.t
    val max_string_length : int option
    val empty : B.t
    val is_empty : B.t -> bool
    val make : int -> char -> B.t
    val length : B.t -> int
    val of_character : char -> B.t
    val of_character_list : char list -> B.t
    val to_character_list : B.t -> char list
    val get : B.t -> index:int -> char option
    val set : B.t -> index:int -> v:char -> B.t option
    val get_exn : B.t -> index:int -> char
    val set_exn : B.t -> index:int -> v:char -> B.t
    val compare : B.t -> B.t -> int
    val compare_substring : B.t * int * int -> B.t * int * int -> int
    type s = Functors.Make_native.t
    module T_length_and_compsub :
      sig
        type t = Functors.Make_native.s
        val length : B.t -> int
        val compare_substring : B.t * int * int -> B.t * int * int -> int
      end
    val compare_substring_strict :
      T_length_and_compsub.t * int * int ->
      T_length_and_compsub.t * int * int -> int option
    val index_of_string :
      ?from:int ->
      ?sub_index:int ->
      ?sub_length:int ->
      T_length_and_compsub.t -> sub:T_length_and_compsub.t -> int option
    val index_of_string_reverse :
      ?from:int ->
      ?sub_index:int ->
      ?sub_length:int ->
      T_length_and_compsub.t -> sub:T_length_and_compsub.t -> int option
    val concat : ?sep:B.t -> B.t list -> B.t
    val fold : B.t -> init:'-> f:('-> char -> 'a) -> 'a
    val foldi : B.t -> init:'-> f:(int -> '-> char -> 'a) -> 'a
    val fold2_exn :
      B.t -> B.t -> init:'-> f:('-> char -> char -> 'a) -> 'a
    val sub_exn : B.t -> index:int -> length:int -> B.t
    val sub : B.t -> index:int -> length:int -> B.t option
    val slice_exn : ?start:int -> ?finish:int -> B.t -> B.t
    val slice : ?start:int -> ?finish:int -> B.t -> B.t option
    val iter : B.t -> f:(char -> unit) -> unit
    val iteri : B.t -> f:(int -> char -> unit) -> unit
    val iter_reverse : B.t -> f:(char -> 'a) -> unit
    val rev : B.t -> B.t
    val map : B.t -> f:(char -> char) -> B.t
    val map2_exn : B.t -> B.t -> f:(char -> char -> char) -> B.t
    val mapi : B.t -> f:(int -> char -> char) -> B.t
    val for_all : B.t -> f:(char -> bool) -> bool
    val exists : B.t -> f:(char -> bool) -> bool
    val index_of_character : B.t -> ?from:int -> char -> int option
    val index_of_character_reverse : B.t -> ?from:int -> char -> int option
    val resize_from_length :
      from:int -> ?length:int -> length_of_s:int -> int * int
    val find :
      ?from:int -> ?length:int -> B.t -> f:(char -> bool) -> int option
    val find_reverse :
      ?from:int -> ?length:int -> B.t -> f:(char -> bool) -> int option
    val filter_map :
      ?from:int -> ?length:int -> B.t -> f:(char -> char option) -> B.t
    val filter : ?from:int -> ?length:int -> B.t -> f:(char -> bool) -> B.t
    val strip :
      ?on:[< `Both | `Left | `Right > `Both ] ->
      ?whitespace:(char -> bool) -> s -> s
    val split : s -> on:[< `Character of char | `String of s ] -> s list
    val sub_same_tl : s -> comp:s -> len:int -> off:int -> bool
    val is_prefix : s -> prefix:s -> bool
    val is_suffix : s -> suffix:s -> bool
    val chop_prefix_exn : s -> prefix:s -> s
    val chop_prefix : s -> prefix:s -> s option
    val chop_suffix_exn : s -> suffix:s -> s
    val chop_suffix : s -> suffix:s -> s option
    val split_at : s -> index:int -> s * s
    val take : s -> index:int -> s
    val drop : s -> index:int -> s
    module Make_output :
      functor (Model : Api.OUTPUT_MODEL->
        sig
          val output :
            ('a, 'b, 'c) Model.channel -> B.t -> (unit, 'd, 'e) Model.thread
        end
    val take_while_with_index : B.t -> f:(int -> char -> bool) -> B.t
    val take_while : B.t -> f:(char -> bool) -> B.t
  end