generic
    type Item is private;
package List_Single_Unbounded_Unmanaged 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;

    Overflow : exception;
    List_Is_Null : exception;

private
    type Node;
    type List is access Node;
    Null_List : constant List := null;
end List_Single_Unbounded_Unmanaged;