sig
  type json = Json.t
  val page : Doc.page
  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 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
  module Jmarkdown :
    sig
      type t = Markdown.text
      val syntax : Syntax.t
      val of_json : json -> t
      val to_json : t -> json
    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 Record :
    sig
      type 'a record
      type 'a signature
      type ('a, 'b) field
      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.Record.field -> t -> bool
          val get : (Data.Record.S.r, 'a) Data.Record.field -> t -> 'a
          val set : (Data.Record.S.r, 'a) Data.Record.field -> '-> t -> t
        end
      val signature :
        page:Doc.page ->
        name:string ->
        descr:Markdown.text -> unit -> 'Data.Record.signature
      val field :
        'Data.Record.signature ->
        name:string ->
        descr:Markdown.text ->
        ?default:'-> 'Data.data -> ('r, 'a) Data.Record.field
      val option :
        'Data.Record.signature ->
        name:string ->
        descr:Markdown.text ->
        'Data.data -> ('r, 'a option) Data.Record.field
      val publish :
        'Data.Record.signature -> (module Data.Record.S with type r = 'a)
    end
  module Tag :
    sig
      type t = Syntax.tag
      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 Enum :
    sig
      type 'a dictionary
      type 'a tag
      type 'a prefix
      val tag_name : 'Data.Enum.tag -> string
      val dictionary :
        page:Doc.page ->
        name:string ->
        title:string ->
        descr:Markdown.text -> unit -> 'Data.Enum.dictionary
      val tag :
        'Data.Enum.dictionary ->
        name:string ->
        ?label:Markdown.text ->
        descr:Markdown.text -> ?value:'-> unit -> 'Data.Enum.tag
      val prefix :
        'Data.Enum.dictionary ->
        prefix:string ->
        ?var:string ->
        ?label:Markdown.text ->
        descr:Markdown.text -> unit -> 'Data.Enum.prefix
      val instance : 'Data.Enum.prefix -> string -> 'Data.Enum.tag
      val extends :
        'Data.Enum.dictionary ->
        'Data.Enum.prefix ->
        name:string ->
        ?label:Markdown.text ->
        descr:Markdown.text -> ?value:'-> unit -> 'Data.Enum.tag
      val tags : 'Data.Enum.dictionary -> Data.Tag.t list
      val page : 'Data.Enum.dictionary -> Doc.page
      val name : 'Data.Enum.dictionary -> string
      val syntax : 'Data.Enum.dictionary -> Markdown.text
      val publish :
        'Data.Enum.dictionary ->
        ?tag:('-> 'Data.Enum.tag) ->
        unit -> (module Data.S with type t = '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
  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