+ private bool try_merge_prev ()
+ {
+ MInterval prev = Prev;
+
+ if (! mergeable (prev))
+ return false;
+
+ int len = prev.Length - prev.LeftLength;
+
+ // PREV is Left, Left.Right, ..., or Left....Right.
+ if (prev != Left)
+ {
+ prev.Parent.Right = prev.Left;
+ while (prev.Parent != Left)
+ {
+ prev.Length -= len;
+ prev = prev.Parent;
+ }
+ }
+ Left.Length -= len;
+ if (Left.Length == Left.LeftLength)
+ Left = Left.Left;
+ return true;
+ }
+
+ private bool try_merge_next ()
+ {
+ MInterval next = Next;
+
+ if (! mergeable (next))
+ return false;
+
+ int len = next.Length - next.LeftLength;
+
+ // NEXT is Right, Right.Left, ..., or Right....Left.
+ if (next != Right)
+ {
+ next.Parent.Left = next.Right;
+ while (next.Parent != Right)
+ {
+ next.Length -= len;
+ next = next.Parent;
+ }
+ }
+ Right.Length -= len;
+ if (Right.Length == Right.LeftLength)
+ Right = Right.Left;
+
+ return true;
+ }
+
+