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

    type Deque is limited private;

    type Location is (Front, Back);

    procedure Copy (From_The_Deque : in Deque; To_The_Deque : in out Deque);
    procedure Clear (The_Deque : in out Deque);
    procedure Add (The_Item : in Item;
                   To_The_Deque : in out Deque;
                   At_The_Location : in Location);
    procedure Pop (The_Deque : in out Deque; At_The_Location : in Location);

    function Is_Equal (Left : in Deque; Right : in Deque) return Boolean;
    function Length_Of (The_Deque : in Deque) return Natural;
    function Is_Empty (The_Deque : in Deque) return Boolean;
    function Front_Of (The_Deque : in Deque) return Item;
    function Back_Of (The_Deque : in Deque) return Item;

    Overflow : exception;
    Underflow : exception;

private
    type Node;
    type Structure is access Node;
    type Deque is
        record
            Guard : Monitor.Kind;
            The_Front : Structure;
            The_Back : Structure;
        end record;
end Deque_Nonpriority_Nonbalking_Multiple_Unbounded_Unmanaged_Noniterator;