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