sig
  module type DESCRIBABLE =
    sig type t val describe : Litiom_choice.DESCRIBABLE.t -> string end
  module type ENUMERABLE =
    sig type t val all : Litiom_choice.ENUMERABLE.t list end
  module type CHOOSABLE =
    sig
      type t
      val of_string : string -> t
      val to_string : t -> string
      val describe : t -> string
      val all : t list
    end
  module type S =
    sig
      type t
      val of_string : string -> t
      val to_string : t -> string
      val param :
        string ->
        (t, [ `WithoutSuffix ], [ `One of t ] Eliom_parameter.param_name)
        Eliom_parameter.params_type
      val input :
        ?a:Html5_types.input_attrib Eliom_content.Html5.F.attrib list ->
        input_type:[< `Button
                    | `Checkbox
                    | `Color
                    | `Date
                    | `Datetime
                    | `Datetime_local
                    | `Email
                    | `File
                    | `Hidden
                    | `Image
                    | `Month
                    | `Number
                    | `Password
                    | `Radio
                    | `Range
                    | `Reset
                    | `Search
                    | `Submit
                    | `Tel
                    | `Text
                    | `Time
                    | `Url
                    | `Week ] ->
        ?name:[< t Eliom_parameter.setoneradio ] Eliom_parameter.param_name ->
        ?value:t -> unit -> [> Html5_types.input ] Eliom_content.Html5.F.elt
      val image_input :
        ?a:Html5_types.input_attrib Eliom_content.Html5.F.attrib list ->
        name:[< (t * Eliom_parameter.coordinates) Eliom_parameter.oneradio ]
             Eliom_parameter.param_name ->
        value:t ->
        ?src:Eliom_content.Html5.F.uri ->
        unit -> [> Html5_types.input ] Eliom_content.Html5.F.elt
      val checkbox :
        ?a:Html5_types.input_attrib Eliom_content.Html5.F.attrib list ->
        ?checked:bool ->
        name:[ `Set of t ] Eliom_parameter.param_name ->
        value:t -> unit -> [> Html5_types.input ] Eliom_content.Html5.F.elt
      val radio :
        ?a:Html5_types.input_attrib Eliom_content.Html5.F.attrib list ->
        ?checked:bool ->
        name:[ `Radio of t ] Eliom_parameter.param_name ->
        value:t -> unit -> [> Html5_types.input ] Eliom_content.Html5.F.elt
      val button :
        ?a:Html5_types.button_attrib Eliom_content.Html5.F.attrib list ->
        name:[< t Eliom_parameter.setone ] Eliom_parameter.param_name ->
        value:t ->
        Html5_types.button_content Eliom_content.Html5.F.elt list ->
        [> Html5_types.button ] Eliom_content.Html5.F.elt
      val select :
        ?a:Html5_types.select_attrib Eliom_content.Html5.F.attrib list ->
        ?required:Html5_types.pcdata Eliom_content.Html5.F.elt ->
        name:[< `One of t ] Eliom_parameter.param_name ->
        t Eliom_content.Html5.F.select_opt ->
        t Eliom_content.Html5.F.select_opt list ->
        [> Html5_types.select ] Eliom_content.Html5.F.elt
      val describe : t -> string
      val all : t list
      val choose :
        ?a:Html5_types.select_attrib Eliom_content.Html5.F.attrib list ->
        name:[< `One of t ] Eliom_parameter.param_name ->
        ?value:t ->
        ?allowed:t list ->
        ?transform:(string -> string) ->
        unit -> [> Html5_types.select ] Eliom_content.Html5.F.elt
    end
  module Make :
    functor (Base : CHOOSABLE->
      sig
        type t = Base.t
        val of_string : string -> t
        val to_string : t -> string
        val param :
          string ->
          (t, [ `WithoutSuffix ], [ `One of t ] Eliom_parameter.param_name)
          Eliom_parameter.params_type
        val input :
          ?a:Html5_types.input_attrib Eliom_content.Html5.F.attrib list ->
          input_type:[< `Button
                      | `Checkbox
                      | `Color
                      | `Date
                      | `Datetime
                      | `Datetime_local
                      | `Email
                      | `File
                      | `Hidden
                      | `Image
                      | `Month
                      | `Number
                      | `Password
                      | `Radio
                      | `Range
                      | `Reset
                      | `Search
                      | `Submit
                      | `Tel
                      | `Text
                      | `Time
                      | `Url
                      | `Week ] ->
          ?name:[< t Eliom_parameter.setoneradio ] Eliom_parameter.param_name ->
          ?value:t ->
          unit -> [> Html5_types.input ] Eliom_content.Html5.F.elt
        val image_input :
          ?a:Html5_types.input_attrib Eliom_content.Html5.F.attrib list ->
          name:[< (t * Eliom_parameter.coordinates) Eliom_parameter.oneradio ]
               Eliom_parameter.param_name ->
          value:t ->
          ?src:Eliom_content.Html5.F.uri ->
          unit -> [> Html5_types.input ] Eliom_content.Html5.F.elt
        val checkbox :
          ?a:Html5_types.input_attrib Eliom_content.Html5.F.attrib list ->
          ?checked:bool ->
          name:[ `Set of t ] Eliom_parameter.param_name ->
          value:t -> unit -> [> Html5_types.input ] Eliom_content.Html5.F.elt
        val radio :
          ?a:Html5_types.input_attrib Eliom_content.Html5.F.attrib list ->
          ?checked:bool ->
          name:[ `Radio of t ] Eliom_parameter.param_name ->
          value:t -> unit -> [> Html5_types.input ] Eliom_content.Html5.F.elt
        val button :
          ?a:Html5_types.button_attrib Eliom_content.Html5.F.attrib list ->
          name:[< t Eliom_parameter.setone ] Eliom_parameter.param_name ->
          value:t ->
          Html5_types.button_content Eliom_content.Html5.F.elt list ->
          [> Html5_types.button ] Eliom_content.Html5.F.elt
        val select :
          ?a:Html5_types.select_attrib Eliom_content.Html5.F.attrib list ->
          ?required:Html5_types.pcdata Eliom_content.Html5.F.elt ->
          name:[< `One of t ] Eliom_parameter.param_name ->
          t Eliom_content.Html5.F.select_opt ->
          t Eliom_content.Html5.F.select_opt list ->
          [> Html5_types.select ] Eliom_content.Html5.F.elt
        val describe : t -> string
        val all : t list
        val choose :
          ?a:Html5_types.select_attrib Eliom_content.Html5.F.attrib list ->
          name:[< `One of t ] Eliom_parameter.param_name ->
          ?value:t ->
          ?allowed:t list ->
          ?transform:(string -> string) ->
          unit -> [> Html5_types.select ] Eliom_content.Html5.F.elt
      end
end