sig
  type 'a or_error = ('a, string) Result.result
  type 'a sequence = ('-> unit) -> unit
  type 'a gen = unit -> 'a option
  type t = [ `Atom of string | `List of CCSexp.t list ]
  type sexp = CCSexp.t
  val equal : CCSexp.t -> CCSexp.t -> bool
  val compare : CCSexp.t -> CCSexp.t -> int
  val hash : CCSexp.t -> int
  val atom : string -> CCSexp.t
  val of_int : int -> CCSexp.t
  val of_bool : bool -> CCSexp.t
  val of_list : CCSexp.t list -> CCSexp.t
  val of_rev_list : CCSexp.t list -> CCSexp.t
  val of_float : float -> CCSexp.t
  val of_unit : CCSexp.t
  val of_pair : CCSexp.t * CCSexp.t -> CCSexp.t
  val of_triple : CCSexp.t * CCSexp.t * CCSexp.t -> CCSexp.t
  val of_quad : CCSexp.t * CCSexp.t * CCSexp.t * CCSexp.t -> CCSexp.t
  val of_variant : string -> CCSexp.t list -> CCSexp.t
  val of_field : string -> CCSexp.t -> CCSexp.t
  val of_record : (string * CCSexp.t) list -> CCSexp.t
  val to_buf : Buffer.t -> CCSexp.t -> unit
  val to_string : CCSexp.t -> string
  val to_file : string -> CCSexp.t -> unit
  val to_file_seq : string -> CCSexp.t CCSexp.sequence -> unit
  val to_chan : Pervasives.out_channel -> CCSexp.t -> unit
  val pp : Format.formatter -> CCSexp.t -> unit
  val pp_noindent : Format.formatter -> CCSexp.t -> unit
  type 'a parse_result = Yield of '| Fail of string | End
  module Decoder :
    sig
      type t
      val of_lexbuf : Lexing.lexbuf -> CCSexp.Decoder.t
      val next : CCSexp.Decoder.t -> CCSexp.sexp CCSexp.parse_result
    end
  val parse_string : string -> CCSexp.t CCSexp.or_error
  val parse_chan : Pervasives.in_channel -> CCSexp.t CCSexp.or_error
  val parse_chan_gen :
    Pervasives.in_channel -> CCSexp.t CCSexp.or_error CCSexp.gen
  val parse_chan_list :
    Pervasives.in_channel -> CCSexp.t list CCSexp.or_error
  val parse_file : string -> CCSexp.t CCSexp.or_error
  val parse_file_list : string -> CCSexp.t list CCSexp.or_error
end