generic
    type Item is private;
package Tree_Binary_Double_Unbounded_Unmanaged is

    type Tree is private;

    type Child is (Left, Right);

    Null_Tree : constant Tree;

    procedure Copy (From_The_Tree : in Tree; To_The_Tree : in out Tree);
    procedure Clear (The_Tree : in out Tree);
    procedure Construct (The_Item : in Item;
                         And_The_Tree : in out Tree;
                         On_The_Child : in Child);
    procedure Set_Item (Of_The_Tree : in out Tree; To_The_Item : in Item);
    procedure Swap_Child (The_Child : in Child;
                          Of_The_Tree : in out Tree;
                          And_The_Tree : in out Tree);

    function Is_Equal (Left : in Tree; Right : in Tree) return Boolean;
    function Is_Null (The_Tree : in Tree) return Boolean;
    function Item_Of (The_Tree : in Tree) return Item;
    function Child_Of (The_Tree : in Tree; The_Child : in Child) return Tree;
    function Parent_Of (The_Tree : in Tree) return Tree;

    Overflow : exception;
    Tree_Is_Null : exception;
    Not_At_Root : exception;

private
    type Node;
    type Tree is access Node;
    Null_Tree : constant Tree := null;
end Tree_Binary_Double_Unbounded_Unmanaged;