sig
  type selection_state = {
    sel_text : Text.t;
    sel_mark : Text.pointer;
    sel_cursor : Text.pointer;
  }
  type search_state = {
    search_word : Text.t;
    search_history : Lwt_read_line.history;
    search_init_history : Lwt_read_line.history;
  }
  type mode =
      Edition of Lwt_read_line.edition_state
    | Selection of Lwt_read_line.Engine.selection_state
    | Search of Lwt_read_line.Engine.search_state
  type state = {
    mode : Lwt_read_line.Engine.mode;
    history : Lwt_read_line.history * Lwt_read_line.history;
  }
  val init : Lwt_read_line.history -> Lwt_read_line.Engine.state
  val reset : Lwt_read_line.Engine.state -> Lwt_read_line.Engine.state
  val update :
    engine_state:Lwt_read_line.Engine.state ->
    ?clipboard:Lwt_read_line.clipboard ->
    command:Lwt_read_line.Command.t -> unit -> Lwt_read_line.Engine.state
  val edition_state :
    Lwt_read_line.Engine.state -> Lwt_read_line.edition_state
  val all_input : Lwt_read_line.Engine.state -> Text.t
end