generic
    type Key is private;    -- private means generic param to be instantiated
    type Data is private;

package List_Pkg is
    type List_Type is private;
    procedure Add (List : in out List_Type;
                   Rec_Key : in Key;
                   Rec_Ptr : in Data);
    function Empty_List (List : in List_Type) return Boolean;
    procedure Start_Walk (List : in out List_Type);
    procedure Walk (List : in out List_Type;
                    Rec_Ptr : out Data;
                    End_List : out Boolean);
    procedure Find (List : in out List_Type;
                    Rec_Key : in Key;
                    Rec_Ptr : out Data;
                    Found : in out Boolean);
    procedure Change_List_Key
                 (List : in out List_Type; Old_Key : in Key; New_Key : in Key);
    procedure Change_List_Data
                 (List : in out List_Type; A_Key : in Key; New_Data : in Data);
    procedure Delete (List : in out List_Type;
                      Rec_Key : in Key;
                      Successful : out Boolean);
private
    type List_Element;
    type List_Ptr is access List_Element;

    type List_Element is
        record
            Search_Key : Key;
            Rec_Data : Data;
            Next : List_Ptr;
        end record;

    type List_Type is
        record
            Head, Tail : List_Ptr;
            Current_Ptr : List_Ptr;
            Prev_Ptr : List_Ptr;
        end record;
end List_Pkg;