with Monitor;
generic
    type Item is private;
package Stack_Multiple_Unbounded_Unmanaged_Iterator is

    type Stack is limited private;

    procedure Copy (From_The_Stack : in Stack; To_The_Stack : in out Stack);
    procedure Clear (The_Stack : in out Stack);
    procedure Push (The_Item : in Item; On_The_Stack : in out Stack);
    procedure Pop (The_Stack : in out Stack);

    function Is_Equal (Left : in Stack; Right : in Stack) return Boolean;
    function Depth_Of (The_Stack : in Stack) return Natural;
    function Is_Empty (The_Stack : in Stack) return Boolean;
    function Top_Of (The_Stack : in Stack) return Item;

    generic
        with procedure Process (The_Item : in Item; Continue : out Boolean);
    procedure Iterate (Over_The_Stack : in Stack);

    Overflow : exception;
    Underflow : exception;

private
    type Node;
    type Structure is access Node;
    type Stack is
        record
            Guard : Monitor.Kind;
            The_Items : Structure;
        end record;
end Stack_Multiple_Unbounded_Unmanaged_Iterator;