AlignDB-IntSpanXS
view release on metacpan or search on metacpan
lib/AlignDB/IntSpanXS.pm view on Meta::CPAN
my $self = shift;
return [ $self->edges ];
}
# edges
# edge_size
# span_size
# as_string
# as_array
# ranges
sub spans {
my $self = shift;
my @spans;
my @ranges = $self->ranges;
while (@ranges) {
my $lower = shift @ranges;
my $upper = shift @ranges;
push @spans, [ $lower, $upper ];
}
return @spans;
}
sub sets {
my $self = shift;
my @sets;
my @ranges = $self->ranges;
while (@ranges) {
my $lower = shift @ranges;
my $upper = shift @ranges;
push @sets, blessed($self)->new("$lower-$upper");
}
return @sets;
}
sub runlists {
my $self = shift;
if ( $self->is_empty ) {
return $self->EMPTY_STRING;
}
my @runlists;
my @ranges = $self->ranges;
while (@ranges) {
my $lower = shift @ranges;
my $upper = shift @ranges;
my $string = $lower == $upper ? $lower : $lower . '-' . $upper;
push @runlists, $string;
}
return @runlists;
}
# cardinality
# is_empty
# is_not_empty
# is_neg_inf
# is_pos_inf
# is_infinite
# is_finite
# is_universal
sub contains_all {
my $self = shift;
for my $i (@_) {
return 0 unless $self->_contains($i);
}
return 1;
}
sub contains_any {
my $self = shift;
for my $i (@_) {
return 1 if $self->_contains($i);
}
return 0;
}
# add_pair
# add_int
# add_array
# add_runlist
sub add_range {
my $self = shift;
my @ranges = @_;
if ( scalar(@ranges) % 2 == 1 ) {
confess "Number of ranges must be even: @ranges\n";
}
while (@ranges) {
my $from = shift @ranges;
my $to = shift @ranges;
$self->add_pair( $from, $to );
}
return $self;
}
sub add {
my $self = shift;
my $first = shift;
if ( ref $first eq __PACKAGE__ ) {
$self->add_range( $first->ranges );
}
elsif ( isint($first) ) {
if ( scalar @_ > 0 ) {
$self->add_array( [ $first, @_ ] );
}
else {
lib/AlignDB/IntSpanXS.pm view on Meta::CPAN
return $sub_set;
}
sub map_set {
my $self = shift;
my $code_ref = shift;
my @map_elements;
for ( $self->elements ) {
foreach my $element ( $code_ref->() ) {
if ( defined $element ) {
push @map_elements, $element;
}
}
}
my $map_set = blessed($self)->new(@map_elements);
return $map_set;
}
sub substr_span {
my $self = shift;
my $string = shift;
my $sub_string = "";
my @spans = $self->spans;
foreach (@spans) {
my ( $lower, $upper ) = @$_;
my $length = $upper - $lower + 1;
$sub_string .= substr( $string, $lower - 1, $length );
}
return $sub_string;
}
sub banish_span {
my $self = shift;
my $start = shift;
my $end = shift;
my $remove_length = $end - $start + 1;
my $new = $self->map_set(
sub {
$_ < $start ? $_
: $_ > $end ? $_ - $remove_length
: ();
}
);
return $new;
}
sub cover {
my $self = shift;
my $cover = blessed($self)->new;
if ( $self->is_not_empty ) {
$cover->add_pair( $self->min, $self->max );
}
return $cover;
}
sub holes {
my $self = shift;
my $holes = 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
if ( $c_set->is_neg_inf ) {
shift @ranges;
shift @ranges;
}
if ( $c_set->is_pos_inf ) {
pop @ranges;
pop @ranges;
}
$holes->add_range(@ranges);
}
return $holes;
}
sub inset {
my $self = shift;
my $n = shift;
my $inset = blessed($self)->new;
my @ranges = $self->ranges;
while (@ranges) {
my $lower = shift @ranges;
my $upper = shift @ranges;
if ( $lower != $self->NEG_INF ) {
$lower += $n;
}
if ( $upper != $self->POS_INF ) {
$upper -= $n;
}
$inset->add_pair( $lower, $upper )
if $lower <= $upper;
}
return $inset;
}
sub trim {
my $self = shift;
my $n = shift;
return $self->inset($n);
( run in 0.996 second using v1.01-cache-2.11-cpan-39bf76dae61 )