sig
  type substring = string * int * int
  and t = Cf_message.substring list
  val normalize : Cf_message.t -> Cf_message.t
  val create : string -> Cf_message.t
  val length : Cf_message.t -> int
  val contents : Cf_message.t -> string
  val copy : Cf_message.t -> Cf_message.t
  val flatten : Cf_message.t -> Cf_message.t
  val split : pos:int -> Cf_message.t -> Cf_message.t * Cf_message.t
  val truncate : pos:int -> Cf_message.t -> Cf_message.t
  val shift : pos:int -> Cf_message.t -> Cf_message.t
  val insert : pos:int -> m:Cf_message.t -> Cf_message.t -> Cf_message.t
  val push :
    Cf_message.t ->
    Cf_message.substring Cf_deque.t -> Cf_message.substring Cf_deque.t
  val pop :
    len:int ->
    Cf_message.substring Cf_deque.t ->
    Cf_message.t * Cf_message.substring Cf_deque.t
  val shiftq :
    len:int ->
    Cf_message.substring Cf_deque.t -> Cf_message.substring Cf_deque.t
  val drain : Cf_message.substring Cf_deque.t -> Cf_message.t
  val drain_seq : ?x:exn -> Cf_message.substring Cf_deque.t -> char Cf_seq.t
  val to_seq : ?x:exn -> Cf_message.t -> char Cf_seq.t
  val to_function : ?x:exn -> Cf_message.t -> unit -> char
  val unsafe_push :
    Cf_message.t ->
    Cf_message.substring Cf_deque.t -> Cf_message.substring Cf_deque.t
  val unsafe_shift1 : Cf_message.t -> Cf_message.t
  val unsafe_to_seq : ?x:exn -> Cf_message.t -> char Cf_seq.t
  val unsafe_to_function : ?x:exn -> Cf_message.t -> unit -> char
end