IntervalTree
view release on metacpan or search on metacpan
lib/IntervalTree.pm view on Meta::CPAN
Version 0.01
=head1 DESCRIPTION
Data structure for performing intersect queries on a set of intervals which
preserves all information about the intervals (unlike bitset projection methods).
=cut
# Historical note:
# This module original contained an implementation based on sorted endpoints
# and a binary search, using an idea from Scott Schwartz and Piotr Berman.
# Later an interval tree implementation was implemented by Ian for Galaxy's
# join tool (see `bx.intervals.operations.quicksect.py`). This was then
# converted to Cython by Brent, who also added support for
# upstream/downstream/neighbor queries. This was modified by James to
# handle half-open intervals strictly, to maintain sort order, and to
# implement the same interface as the original Intersecter.
=head1 SYNOPSIS
lib/IntervalTree.pm view on Meta::CPAN
currently the root. The return value is the new root of the tree (which
may or may not be this node!)
=cut
sub insert {
my ($self, $start, $end, $interval) = @_;
my $croot = $self;
# If starts are the same, decide which to add interval to based on
# end, thus maintaining sortedness relative to start/end
my $decision_endpoint = $start;
if ($start == $self->{start}) {
$decision_endpoint = $end;
}
if ($decision_endpoint > $self->{start}) {
# insert to cright tree
if ($self->{cright} != $EmptyNode) {
$self->{cright} = $self->{cright}->insert( $start, $end, $interval );
}
else {
$self->{cright} = IntervalTree::Node->new( $start, $end, $interval );
}
# rebalance tree
if ($self->{priority} < $self->{cright}{priority}) {
$croot = $self->rotate_left();
( run in 1.729 second using v1.01-cache-2.11-cpan-524268b4103 )