with Window_Io;
with New_Keys;
generic
    type Element is private;

    with function Line_Image (E : Element) return String;

    with function Is_Select_Key (Key : New_Keys.Key_Type) return Boolean;

package Single_Selection_Electric_Menus is
    subtype Window_Type is Window_Io.File_Type;
    type Menu_Definition is private;
    function Make return Menu_Definition;
    procedure Add (E : Element; To : in out Menu_Definition);

    type Layout is (Vertical, Horizontal);

    function Get_User_Selection
                (Menu : Window_Type;
                 Definition : Menu_Definition;
                 Column_Offset : Natural := 0;
                 Line_Offset : Natural := 0;
                 Presentation : Layout := Vertical;
                 Max_Wait : Duration := Duration'Last) return Element;


    Time_Out : exception;

private
    type Node;
    type Menu_Definition is access Node;

    type Node is
        record
            Elem : Element;
            First_Char : Character;
            Line : Window_Io.Line_Number;
            Column : Window_Io.Column_Number;
            Next : Menu_Definition;
            Previous : Menu_Definition;
        end record;
end Single_Selection_Electric_Menus;
