sig
  type 'a callback = ('a -> unit) -> unit
  val register_value :
    package:Server.Package.package ->
    name:string ->
    descr:Markdown.text ->
    output:'a Server.Request.output ->
    get:(unit -> 'a) ->
    ?add_hook:unit Server.States.callback -> unit -> Server.Request.signal
  val register_state :
    package:Server.Package.package ->
    name:string ->
    descr:Markdown.text ->
    data:'a Server.Data.data ->
    get:(unit -> 'a) ->
    set:('a -> unit) ->
    ?add_hook:unit Server.States.callback -> unit -> Server.Request.signal
  type 'a model
  val model : unit -> 'a Server.States.model
  val column :
    name:string ->
    descr:Markdown.text ->
    data:'b Server.Request.output ->
    get:('a -> 'b) -> ?default:'b -> 'a Server.States.model -> unit
  val option :
    name:string ->
    descr:Markdown.text ->
    data:'b Server.Request.output ->
    get:('a -> 'b option) -> 'a Server.States.model -> unit
  type 'a array
  val reload : 'a Server.States.array -> unit
  val update : 'a Server.States.array -> 'a -> unit
  val remove : 'a Server.States.array -> 'a -> unit
  val signal : 'a Server.States.array -> Server.Request.signal
  val register_array :
    package:Server.Package.package ->
    name:string ->
    descr:Markdown.text ->
    key:('a -> string) ->
    ?keyName:string ->
    ?keyType:Server.Package.jtype ->
    iter:'a Server.States.callback ->
    ?add_update_hook:'a Server.States.callback ->
    ?add_remove_hook:'a Server.States.callback ->
    ?add_reload_hook:unit Server.States.callback ->
    'a Server.States.model -> 'a Server.States.array
end