sig
  type json = Json.t
  val pretty : Format.formatter -> Data.json -> unit
  module type S =
    sig
      type t
      val syntax : Syntax.t
      val of_json : Data.json -> Data.S.t
      val to_json : Data.S.t -> Data.json
    end
  module type Info =
    sig val page : Doc.page val name : string val descr : Markdown.text end
  type 'a data = (module Data.S with type t = 'a)
  module type S_collection =
    sig
      type t
      val syntax : Syntax.t
      val of_json : json -> t
      val to_json : t -> json
      module Joption :
        sig
          type t = t option
          val syntax : Syntax.t
          val of_json : json -> t
          val to_json : t -> json
        end
      module Jlist :
        sig
          type t = t list
          val syntax : Syntax.t
          val of_json : json -> t
          val to_json : t -> json
        end
      module Jarray :
        sig
          type t = t array
          val syntax : Syntax.t
          val of_json : json -> t
          val to_json : t -> json
        end
    end
  module Collection :
    functor (A : S->
      sig
        type t = A.t
        val syntax : Syntax.t
        val of_json : json -> t
        val to_json : t -> json
        module Joption :
          sig
            type t = t option
            val syntax : Syntax.t
            val of_json : json -> t
            val to_json : t -> json
          end
        module Jlist :
          sig
            type t = t list
            val syntax : Syntax.t
            val of_json : json -> t
            val to_json : t -> json
          end
        module Jarray :
          sig
            type t = t array
            val syntax : Syntax.t
            val of_json : json -> t
            val to_json : t -> json
          end
      end
  module Joption :
    functor (A : S->
      sig
        type t = A.t option
        val syntax : Syntax.t
        val of_json : json -> t
        val to_json : t -> json
      end
  module Jpair :
    functor (A : S) (B : S->
      sig
        type t = A.t * B.t
        val syntax : Syntax.t
        val of_json : json -> t
        val to_json : t -> json
      end
  module Jtriple :
    functor (A : S) (B : S) (C : S->
      sig
        type t = A.t * B.t * C.t
        val syntax : Syntax.t
        val of_json : json -> t
        val to_json : t -> json
      end
  module Jlist :
    functor (A : S->
      sig
        type t = A.t list
        val syntax : Syntax.t
        val of_json : json -> t
        val to_json : t -> json
      end
  module Jarray :
    functor (A : S->
      sig
        type t = A.t array
        val syntax : Syntax.t
        val of_json : json -> t
        val to_json : t -> json
      end
  module Junit :
    sig
      type t = unit
      val syntax : Syntax.t
      val of_json : json -> t
      val to_json : t -> json
    end
  module Jany :
    sig
      type t = json
      val syntax : Syntax.t
      val of_json : json -> t
      val to_json : t -> json
    end
  module Jbool :
    sig
      type t = bool
      val syntax : Syntax.t
      val of_json : json -> t
      val to_json : t -> json
      module Joption :
        sig
          type t = t option
          val syntax : Syntax.t
          val of_json : json -> t
          val to_json : t -> json
        end
      module Jlist :
        sig
          type t = t list
          val syntax : Syntax.t
          val of_json : json -> t
          val to_json : t -> json
        end
      module Jarray :
        sig
          type t = t array
          val syntax : Syntax.t
          val of_json : json -> t
          val to_json : t -> json
        end
    end
  module Jint :
    sig
      type t = int
      val syntax : Syntax.t
      val of_json : json -> t
      val to_json : t -> json
      module Joption :
        sig
          type t = t option
          val syntax : Syntax.t
          val of_json : json -> t
          val to_json : t -> json
        end
      module Jlist :
        sig
          type t = t list
          val syntax : Syntax.t
          val of_json : json -> t
          val to_json : t -> json
        end
      module Jarray :
        sig
          type t = t array
          val syntax : Syntax.t
          val of_json : json -> t
          val to_json : t -> json
        end
    end
  module Jfloat :
    sig
      type t = float
      val syntax : Syntax.t
      val of_json : json -> t
      val to_json : t -> json
      module Joption :
        sig
          type t = t option
          val syntax : Syntax.t
          val of_json : json -> t
          val to_json : t -> json
        end
      module Jlist :
        sig
          type t = t list
          val syntax : Syntax.t
          val of_json : json -> t
          val to_json : t -> json
        end
      module Jarray :
        sig
          type t = t array
          val syntax : Syntax.t
          val of_json : json -> t
          val to_json : t -> json
        end
    end
  module Jstring :
    sig
      type t = string
      val syntax : Syntax.t
      val of_json : json -> t
      val to_json : t -> json
      module Joption :
        sig
          type t = t option
          val syntax : Syntax.t
          val of_json : json -> t
          val to_json : t -> json
        end
      module Jlist :
        sig
          type t = t list
          val syntax : Syntax.t
          val of_json : json -> t
          val to_json : t -> json
        end
      module Jarray :
        sig
          type t = t array
          val syntax : Syntax.t
          val of_json : json -> t
          val to_json : t -> json
        end
    end
  module Jident :
    sig
      type t = string
      val syntax : Syntax.t
      val of_json : json -> t
      val to_json : t -> json
      module Joption :
        sig
          type t = t option
          val syntax : Syntax.t
          val of_json : json -> t
          val to_json : t -> json
        end
      module Jlist :
        sig
          type t = t list
          val syntax : Syntax.t
          val of_json : json -> t
          val to_json : t -> json
        end
      module Jarray :
        sig
          type t = t array
          val syntax : Syntax.t
          val of_json : json -> t
          val to_json : t -> json
        end
    end
  module Jtext :
    sig
      type t = json
      val syntax : Syntax.t
      val of_json : json -> t
      val to_json : t -> json
    end
  type 'a record
  type 'a signature
  type ('a, 'b) field
  module Record :
    sig
      module type S =
        sig
          type r
          type t = r record
          val syntax : Syntax.t
          val of_json : json -> t
          val to_json : t -> json
          val default : t
          val has : (Data.Record.S.r, 'a) Data.field -> t -> bool
          val get : (Data.Record.S.r, 'a) Data.field -> t -> 'a
          val set : (Data.Record.S.r, 'a) Data.field -> '-> t -> t
        end
      val signature :
        page:Doc.page ->
        name:string -> descr:Markdown.text -> unit -> 'Data.signature
      val field :
        'Data.signature ->
        name:string ->
        descr:Markdown.text ->
        ?default:'-> 'Data.data -> ('r, 'a) Data.field
      val option :
        'Data.signature ->
        name:string ->
        descr:Markdown.text -> 'Data.data -> ('r, 'a option) Data.field
      val publish :
        'Data.signature -> (module Data.Record.S with type r = 'a)
    end
  module type Map =
    sig
      type 'a t
      type key
      val empty : 'Data.Map.t
      val add : Data.Map.key -> '-> 'Data.Map.t -> 'Data.Map.t
      val find : Data.Map.key -> 'Data.Map.t -> 'a
    end
  module type Index =
    sig
      type t
      val syntax : Syntax.t
      val of_json : json -> t
      val to_json : t -> json
      module Joption :
        sig
          type t = t option
          val syntax : Syntax.t
          val of_json : json -> t
          val to_json : t -> json
        end
      module Jlist :
        sig
          type t = t list
          val syntax : Syntax.t
          val of_json : json -> t
          val to_json : t -> json
        end
      module Jarray :
        sig
          type t = t array
          val syntax : Syntax.t
          val of_json : json -> t
          val to_json : t -> json
        end
      val get : t -> int
      val find : int -> t
      val clear : unit -> unit
    end
  module Static :
    functor (M : Map) (I : Info->
      sig
        type t = M.key
        val syntax : Syntax.t
        val of_json : json -> t
        val to_json : t -> json
        module Joption :
          sig
            type t = t option
            val syntax : Syntax.t
            val of_json : json -> t
            val to_json : t -> json
          end
        module Jlist :
          sig
            type t = t list
            val syntax : Syntax.t
            val of_json : json -> t
            val to_json : t -> json
          end
        module Jarray :
          sig
            type t = t array
            val syntax : Syntax.t
            val of_json : json -> t
            val to_json : t -> json
          end
        val get : t -> int
        val find : int -> t
        val clear : unit -> unit
      end
  module Index :
    functor (M : Map) (I : Info->
      sig
        type t = M.key
        val syntax : Syntax.t
        val of_json : json -> t
        val to_json : t -> json
        module Joption :
          sig
            type t = t option
            val syntax : Syntax.t
            val of_json : json -> t
            val to_json : t -> json
          end
        module Jlist :
          sig
            type t = t list
            val syntax : Syntax.t
            val of_json : json -> t
            val to_json : t -> json
          end
        module Jarray :
          sig
            type t = t array
            val syntax : Syntax.t
            val of_json : json -> t
            val to_json : t -> json
          end
        val get : t -> int
        val find : int -> t
        val clear : unit -> unit
      end
  module type IdentifiedType =
    sig
      type t
      val id : Data.IdentifiedType.t -> int
      val page : Doc.page
      val name : string
      val descr : Markdown.text
    end
  module Identified :
    functor (A : IdentifiedType->
      sig
        type t = A.t
        val syntax : Syntax.t
        val of_json : json -> t
        val to_json : t -> json
        module Joption :
          sig
            type t = t option
            val syntax : Syntax.t
            val of_json : json -> t
            val to_json : t -> json
          end
        module Jlist :
          sig
            type t = t list
            val syntax : Syntax.t
            val of_json : json -> t
            val to_json : t -> json
          end
        module Jarray :
          sig
            type t = t array
            val syntax : Syntax.t
            val of_json : json -> t
            val to_json : t -> json
          end
        val get : t -> int
        val find : int -> t
        val clear : unit -> unit
      end
  module type Enum =
    sig
      type t
      val values : (Data.Enum.t * string * Markdown.text) list
      val page : Doc.page
      val name : string
      val descr : Markdown.text
    end
  module Dictionary :
    functor (E : Enum->
      sig
        type t = E.t
        val syntax : Syntax.t
        val of_json : json -> t
        val to_json : t -> json
        module Joption :
          sig
            type t = t option
            val syntax : Syntax.t
            val of_json : json -> t
            val to_json : t -> json
          end
        module Jlist :
          sig
            type t = t list
            val syntax : Syntax.t
            val of_json : json -> t
            val to_json : t -> json
          end
        module Jarray :
          sig
            type t = t array
            val syntax : Syntax.t
            val of_json : json -> t
            val to_json : t -> json
          end
      end
  exception InputError of string
  val failure :
    ?json:Data.json ->
    ('a, Format.formatter, unit, 'b) Pervasives.format4 -> 'a
  val failure_from_type_error : string -> Data.json -> 'a
end