sig
  type message
  val size : Rich_text.message -> int
  val char_at : Rich_text.message -> int -> char
  val string : Rich_text.message -> string
  val substring : Rich_text.message -> int -> int -> string
  val tags_at :
    Rich_text.message -> int -> (Stdlib.Format.stag * int * int) list
  val visit :
    ?output:(string -> int -> int -> unit) ->
    ?open_tag:(Stdlib.Format.stag -> int -> int -> unit) ->
    ?close_tag:(Stdlib.Format.stag -> int -> int -> unit) ->
    Rich_text.message -> unit
  val pretty :
    ?vbox:int -> Stdlib.Format.formatter -> Rich_text.message -> unit
  type buffer
  val create : ?indent:int -> ?margin:int -> unit -> Rich_text.buffer
  val message : Rich_text.buffer -> Rich_text.message
  val add_char : Rich_text.buffer -> char -> unit
  val add_string : Rich_text.buffer -> string -> unit
  val add_substring : Rich_text.buffer -> string -> int -> int -> unit
  val formatter : Rich_text.buffer -> Stdlib.Format.formatter
  val bprintf :
    Rich_text.buffer ->
    ('a, Stdlib.Format.formatter, unit) Stdlib.format -> 'a
  val kprintf :
    (Stdlib.Format.formatter -> 'a) ->
    Rich_text.buffer ->
    ('b, Stdlib.Format.formatter, unit, 'a) Stdlib.format4 -> 'b
  val contents : Rich_text.buffer -> string
  val sub : Rich_text.buffer -> int -> int -> string
  val range : Rich_text.buffer -> int -> int -> string
  val trim : Rich_text.buffer -> int * int
  val shrink : Rich_text.buffer -> unit
  val to_string :
    ?indent:int ->
    ?margin:int ->
    ?trim:bool -> (Stdlib.Format.formatter -> '-> unit) -> '-> string
end