generic
    type Item is private;
    type List is private;
    with procedure Clear (The_List : in out List);
    with procedure Construct (The_Item : in Item; And_The_List : in out List);
    with procedure Swap_Tail (Of_The_List : in out List;
                              And_The_List : in out List);
    with function Is_Null (The_List : in List) return Boolean;
    with function Tail_Of (The_List : in List) return List;
    with function Predecessor_Of (The_List : in List) return List;
package List_Utilities_Double is

    type Items is array (Positive range <>) of Item;

    procedure Construct (The_Items : in Items; And_The_List : in out List);
    procedure Construct (The_List : in out List; And_The_List : in out List);
    procedure Split (The_List : in out List;
                     At_The_Position : in Positive;
                     Into_The_List : in out List);
    procedure Insert (The_Item : in Item;
                      In_The_List : in out List;
                      After_The_Position : in Positive);
    procedure Insert (The_List : in out List;
                      In_The_List : in out List;
                      After_The_Position : in Positive);
    procedure Insert (The_Item : in Item; After_The_List : in out List);
    procedure Insert (The_List : in List; After_The_List : in out List);
    procedure Remove_Item (In_The_List : in out List;
                           At_The_Position : in Positive);

    function Foot_Of (The_List : in List) return List;
    function Is_Head (The_List : in List) return Boolean;
    function Head_Of (The_List : in List) return List;

    Position_Error : exception;

end List_Utilities_Double;