generic
    type Item is private;
    The_Size : in Positive;
package List_Double_Bounded_Managed is

    type List is private;

    Null_List : constant List;

    procedure Copy (From_The_List : in List; To_The_List : in out List);
    procedure Clear (The_List : in out List);
    procedure Construct (The_Item : in Item; And_The_List : in out List);
    procedure Set_Head (Of_The_List : in out List; To_The_Item : in Item);
    procedure Swap_Tail (Of_The_List : in out List; And_The_List : in out List);

    function Is_Equal (Left : in List; Right : in List) return Boolean;
    function Length_Of (The_List : in List) return Natural;
    function Is_Null (The_List : in List) return Boolean;
    function Head_Of (The_List : in List) return Item;
    function Tail_Of (The_List : in List) return List;
    function Predecessor_Of (The_List : in List) return List;

    Overflow : exception;
    List_Is_Null : exception;
    Not_At_Head : exception;

private
    type List is
        record
            The_Head : Natural := 0;
        end record;
    Null_List : constant List := List'(The_Head => 0);
end List_Double_Bounded_Managed;