public static int RemoveTimeSubset <T>(this AvlTree <MappedInterval <T> > tree, long from, long to)
{
var removedNodesCount = 0;
INode <MappedInterval <T> > first = null;
INode <MappedInterval <T> > last = null;
// TODO Remove .ToArray()
foreach (var node in tree.FirstOrderedSubsequence(node => AcceptNode(node.Key, from, to)).ToArray())
{
if (first == null)
{
first = node;
}
last = node;
tree.Delete(node.Key);
removedNodesCount++;
}
if (first != null && first.Key.IntervalStart < from)
{
tree.Insert(new MappedInterval <T>(first.Key.IntervalStart, from, first.Key.Payload));
}
if (last != null && to < last.Key.IntervalEnd)
{
tree.Insert(new MappedInterval <T>(to, last.Key.IntervalEnd, last.Key.Payload));
}
return(removedNodesCount);
}