AlignDB-IntSpan
view release on metacpan or search on metacpan
lib/AlignDB/IntSpan.pm view on Meta::CPAN
}
sub EMPTY_STRING {
return '-';
}
sub new {
my $class = shift;
my $self = {};
$self->{edges} = [];
bless $self, $class;
$self->add(@_) if @_ > 0;
return $self;
}
sub valid {
my $this = shift;
my $runlist = shift;
my $class = ref($this) || $this;
my $set = new $class;
lib/AlignDB/IntSpan.pm view on Meta::CPAN
}
sub sets {
my $self = shift;
my @sets;
my @edges = $self->edges;
while (@edges) {
my $lower = shift @edges;
my $upper = shift(@edges) - 1;
push @sets, Scalar::Util::blessed($self)->new("$lower-$upper");
}
if (@sets) {
return @sets;
}
else {
return;
}
}
lib/AlignDB/IntSpan.pm view on Meta::CPAN
$self->remove_range(@ranges);
}
return $self;
}
#@returns AlignDB::IntSpan
sub copy {
my $self = shift;
my $copy = Scalar::Util::blessed($self)->new;
$copy->{edges} = [ $self->edges ];
return $copy;
}
#@returns AlignDB::IntSpan
sub union {
my $self = shift;
my $new = $self->copy;
lib/AlignDB/IntSpan.pm view on Meta::CPAN
return $slice;
}
sub _splice {
my $self = shift;
my $offset = shift;
my $length = shift;
#@type AlignDB::IntSpan
my $slice = Scalar::Util::blessed($self)->new;
my @edges = $self->edges;
while ( @edges > 1 ) {
my ( $lower, $upper ) = @edges[ 0, 1 ];
my $span_size = $upper - $lower;
if ( $offset <= $span_size ) {
last;
}
lib/AlignDB/IntSpan.pm view on Meta::CPAN
my $self = shift;
my $code_ref = shift;
my @sub_elements;
for ( $self->elements ) {
if ( $code_ref->() ) {
push @sub_elements, $_;
}
}
my $sub_set = Scalar::Util::blessed($self)->new(@sub_elements);
return $sub_set;
}
sub map_set {
my $self = shift;
my $code_ref = shift;
my @map_elements;
for ( $self->elements ) {
for my $element ( $code_ref->() ) {
if ( defined $element ) {
push @map_elements, $element;
}
}
}
my $map_set = Scalar::Util::blessed($self)->new(@map_elements);
return $map_set;
}
sub substr_span {
my $self = shift;
my $string = shift;
my $sub_string = "";
my @spans = $self->spans;
lib/AlignDB/IntSpan.pm view on Meta::CPAN
}
);
return $new;
}
#@returns AlignDB::IntSpan
sub cover {
my $self = shift;
my $cover = Scalar::Util::blessed($self)->new;
if ( $self->is_not_empty ) {
$cover->add_pair( $self->min, $self->max );
}
return $cover;
}
#@returns AlignDB::IntSpan
sub holes {
my $self = shift;
my $holes = Scalar::Util::blessed($self)->new;
if ( $self->is_empty or $self->is_universal ) {
# empty set and universal set have no holes
}
else {
my $c_set = $self->complement;
my @ranges = $c_set->ranges;
# Remove infinite arms of complement set
lib/AlignDB/IntSpan.pm view on Meta::CPAN
}
return $holes;
}
#@returns AlignDB::IntSpan
sub inset {
my $self = shift;
my $n = shift;
my $inset = Scalar::Util::blessed($self)->new;
my @edges = $self->edges;
while (@edges) {
my $lower = shift @edges;
my $upper = shift(@edges) - 1;
if ( $lower != $self->NEG_INF ) {
$lower += $n;
}
if ( $upper != $self->POS_INF ) {
$upper -= $n;
}
lib/AlignDB/IntSpan.pm view on Meta::CPAN
my $self = shift;
my $n = shift;
return $self->inset( -$n );
}
#@returns AlignDB::IntSpan
sub excise {
my $self = shift;
my $minlength = shift;
my $set = Scalar::Util::blessed($self)->new;
map { $set->merge($_) } grep { $_->size >= $minlength } $self->sets;
return $set;
}
#@returns AlignDB::IntSpan
sub fill {
my $self = shift;
my $maxlength = shift;
lib/AlignDB/IntSpan.pm view on Meta::CPAN
Carp::confess "Don't know how to deal with input to find_island\n";
}
return $island;
}
sub _find_islands_int {
my $self = shift;
my $number = shift;
my $island = Scalar::Util::blessed($self)->new;
# if $pos & 1, i.e. $pos is odd number, $val is in the set
my $pos = $self->_find_pos( $number + 1, 0 );
if ( $pos & 1 ) {
my @ranges = $self->ranges;
$island->add_range( $ranges[ $pos - 1 ], $ranges[$pos] );
}
return $island;
}
sub _find_islands_set {
my $self = shift;
my $supplied = shift;
my $islands = Scalar::Util::blessed($self)->new;
if ( $self->overlap($supplied) ) {
for my $subset ( $self->sets ) {
$islands->merge($subset) if $subset->overlap($supplied);
}
}
return $islands;
}
#@returns AlignDB::IntSpan
sub nearest_island {
my $self = shift;
my $supplied = shift;
if ( ref $supplied eq __PACKAGE__ ) { # just OK
}
elsif ( Scalar::Util::Numeric::isint($supplied) ) {
$supplied = Scalar::Util::blessed($self)->new($supplied);
}
else {
Carp::confess "Don't know how to deal with input to nearest_island\n";
}
my $island = Scalar::Util::blessed($self)->new;
my $min_d;
for my $s ( $self->sets ) {
for my $ss ( $supplied->sets ) {
next if $s->overlap($ss);
my $d = $s->distance($ss);
if ( !defined $min_d or $d <= $min_d ) {
if ( defined $min_d and $d == $min_d ) {
$island->merge($s);
}
else {
lib/AlignDB/IntSpan.pm view on Meta::CPAN
# Converts a set specification into a set
sub _real_set {
my $self = shift;
my $supplied = shift;
if ( defined $supplied and ref $supplied eq __PACKAGE__ ) {
return $supplied;
}
else {
return Scalar::Util::blessed($self)->new($supplied);
}
}
# Return the index of the first element >= the supplied value.
#
# If the supplied value is larger than any element in the list the returned
# value will be equal to the size of the list.
#
# If $pos & 1, i.e. $pos is odd number, $val is in the set
sub _find_pos {
t/01.basic.t view on Meta::CPAN
BEGIN {
use_ok('AlignDB::IntSpan');
}
# Basic hash based set for testing
package TestSet;
sub new {
return bless {}, shift;
}
sub add {
my $self = shift;
$self->{$_} = 1 for @_;
}
sub add_range {
my $self = shift;
die unless ( @_ % 2 ) == 0;
( run in 1.016 second using v1.01-cache-2.11-cpan-de7293f3b23 )