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 -> (Format.tag * int * int) list
  val visit :
    ?output:(string -> int -> int -> unit) ->
    ?open_tag:(Format.tag -> int -> int -> unit) ->
    ?close_tag:(Format.tag -> int -> int -> unit) ->
    Rich_text.message -> unit
  val pretty : ?vbox:int -> 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 -> Format.formatter
  val bprintf :
    Rich_text.buffer -> ('a, Format.formatter, unit) Pervasives.format -> 'a
  val kprintf :
    (Format.formatter -> 'a) ->
    Rich_text.buffer ->
    ('b, Format.formatter, unit, 'a) Pervasives.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
end