NAME

Data::Range::Compare - Framework for calculating range intersections

SYNOPSIS

use Data::Range::Compare qw(HELPER_CB);

my %helper=HELPER_CB;

my @tom;
my @harry;
my @sally;

push @tom,Data::Range::Compare->new(\%helper,0,1);
push @tom,Data::Range::Compare->new(\%helper,3,7);

push @harry,Data::Range::Compare->new(\%helper,9,11);

push @sally,Data::Range::Compare->new(\%helper,6,7);

my @cmp=(\@tom,\@harry,\@sally);

my $sub=Data::Range::Compare->range_compare(\%helper,\@cmp);
while(my @row=$sub->()) {
  my $common_range=
    Data::Range::Compare->get_common_range(\%helper,\@row);
  print "Common Range: $common_range\n";
  my ($tom,$harry,$sally)=@row;
  print "tom:   $tom\n";
  print "harry: $harry\n";
  print "sally: $sally\n";
}

DESCRIPTION

This package is a universal framework for finding intersections in data representing ranges. The Ranges simply need to be two dimensional.

Data::Range::Compare is not intended to be used directly although it can be. For the most part Data::Range::Compare is intended to be subclassed by other packages.

For a list of more detailed examples, check out the cookbook.

Export list

:KEYS

key_helper
key_start
key_end
key_generated
key_missing
key_data

:HELPER_CB

HELPER_CB

:HELPER

add_one
sub_one
cmp_values

:SORT

sort_largest_range_end_first
sort_largest_range_start_first
sort_smallest_range_start_first
sort_smallest_range_end_first
sort_in_consolidate_order
sort_in_presentation_order

%helper

%helper is the primary driver for this framework.

Data::Range::Compare relies on %helper to do its internal work. So this section explains how to populate %helper.

# to import the default %helper functions into your package
use Data::Range::Compare qw(:HELPER);

my %helper=(
  add_one=>\&add_one
  sub_one=>\&sub_one
  cmp_values=>\&cmp_values
);
  • add_one

    This function accepts one argument and returns the next thing. If you are implementing your own add_one, just make sure it returns the correct next value for your data.

    Example:
    
    $helper{add_one}=sub {$_[0] + 1};
    my $next=$helper{add_one}->(1);
    $next==2;
    
    Same as
    
    %helper=HELPER_CB;
    
    Or Write your own
    
    # a-z example
    my @list=('a' .. 'z');
    my $id=-1; 
    my %ids=map { ($_,++$id) } @list;
    
    sub my_add_one {
      my $here=$ids{$_[0]};
      ++$here;
      return 'z' if $#list<$here;
      $list[$here]
    }
    
    $helper{add_one}=\&my_add_one;
    my $next=$helper{add_one}->('a');
    $next eq 'b';
  • sub_one

    This function accepts one argument and returns the next thing. If you are implementing your own sub_one, just make sure it returns the correct previous value for your data.

    Example:
    
    $helper{sub_one}=sub {$_[0] - 1};
    my $next=$helper{sub_one}->(1);
    $next==0;
    
    Same as
    
    %helper=HELPER_CB;
    
    Or Write your own
    
    # a-z example
    my @list=('a' .. 'z');
    my $id=-1; 
    my %ids=map { ($_,++$id) } @list;
    
    sub my_sub_one {
      my $here=$ids{$_[0]};
      --$here;
      return 'z' if 0>$here;
      $list[$here]
    }
    
    $helper{sub_one}=\&my_sub_one;
    my $next=$helper{sub_one}->('a');
    $next eq 'b';
  • cmp_values

    This function accepts 2 arguments and should return one of the following values: 0,-1,1

    Examples:

    $helper{cmp_values}=sub {$_[0] <=> $_[1] };
    my $cmp=$helper{cmp_values}->(0,1);
    $cmp==-1;
    
    Same as
    
    %helper=HELPER_CB;
    
    Or Write your own
    
    # a-z example
    $helper{cmp_values}=sub {$_[0] cmp $_[1] };
    my $cmp=$helper{cmp_values}->(qw(a b));
    $cmp==-1;

OO Methods

This section covers the OO Methods in the package

  • my $range=new Data::Range::Compare(\%helper,0,1);

  • my $range=new Data::Range::Compare(\%helper,0,1,$generated);

  • my $range=new Data::Range::Compare(\%helper,0,1,$generated,$missing);

  • my $range=Data::Range::Compare->new(\%helper,0,1);

  • my $range=Data::Range::Compare->new(\%helper,0,1,$generated);

  • my $range=Data::Range::Compare->new(\%helper,0,1,$generated,$missing);

    This function acts as the general package constructor. "$generated" represents the $range->generated state. "$missing" represents the $range->missing state.

    %helper is what drives the internals of our instance.

  • my $value=$range->helper_cb('add_one',1)

  • my $value=$range->helper_cb('sub_one',1)

  • my $value=$range->helper_cb('cmp_values',1,1)

    Grants access to this range's \%helper.

  • my $range_end=$range->range_end;

    Returns the "thing" that is denoted as the end of this range.

  • my $range_start=$range->range_start;

    Returns the "thing" that is denoted as the start of this range.

  • my $notation=$range->notation;

    Returns a string representing "range_start - range_end". This is the same as print $range.

  • my $helper_hash=$range->helper_hash;

    Gets the \%helper for this instance.

  • if($range->missing) { .. }

    Returns the missing state

  • if($range->generated) { .. }

    Returns the generated state

  • $range->data->{some_lable}='some value'

  • my $value=$range->data->{some_lable};

  • my $hash_ref=$range->data;

    Lets you tag this block with your data.

  • if($range->overlap($another_range);

    Returns true if either of these ranges overlap.

  • my $next_start=$range->next_range_start;

    Gets the thing that represents the start of the next range.

  • my $previous_end=$range->previous_range_end;

    Gets the thing that represents the end of the previous range.

  • my $cmp=$range->cmp_range_start($range_b);

    Wrapper function does the same as the following.

    my $cmp=$range->helper_cb(
      'cmp_values'
      ,$range->range_start
      ,$range_b->range_start
    );
  • my $cmp=$range->cmp_range_end($range_b);

    Wrapper function does the same as the following.

    my $cmp=$range->helper_cb(
      'cmp_values'
      ,$range->range_end
      ,$range_b->range_end
    );
  • if($range_a->contiguous_check($range_b) { ... }

    Returns true if $range_b immediately follows $range_a

  • my $cmp=$range->cmp_ranges($range_b);

    Does an an ascending order style comparison.

  • my $common=Data::Range::Compare->get_common_range(\%helper,\@list)

    Returns a new Data::Range::Compare object representing the intersecting ranges ranges found in \@list.

  • my $range=Data::Range::Compare->get_overlapping_range( \%helper, \@list );

    Returns a new Data::Range::Compare object representing the outer most start and end found in \@list.

  • my $ref=Data::Range::Compare->consolidate_ranges(\%helper,\@list);

    Returns a list reference of sorted and consolidated Data::Range::Compare objects .

  • my $ref=Data::Range::Compare->fill_missing_ranges(\%helper,\@list);

  • my $ref=Data::Range::Compare->fill_missing_ranges(\%helper, \@list, consolidate_ranges=>0);

  • my $ref=Data::Range::Compare->fill_missing_ranges(\%helper, \@list, consolidate_ranges=>1);

    Returns a sorted contiguous list of Data::Range::Compare objects. All objects generated by fill_missing_ranges are created as missing and generated.

    Optional argument consolidate_ranges=>(0||1)

    consolidate_ranges=>1 
      calls Data::Range::Compare->consolidate_ranges(\%helper,\@list)
      before processing ranges
    
    consolidate_ranges=>0 ( Default )
      Skips the consolidate pass
  • my $ref=Data::Range::Compare->range_start_end_fill( \%helper, \@list_of_lists);

    Creates filler ranges ensuring each list of ranges starts and ends with the same value. All ranges created by range_start_end_fill are missing and generated.

  • my $sub=Data::Range::Compare->range_compare( \%helper, \@list_of_lists );

  • my $sub=Data::Range::Compare->range_compare(\%helper, \@list_of_lists, consolidate_ranges=>0);

  • my $sub=Data::Range::Compare->range_compare( \%helper, \@list_of_lists, consolidate_ranges=>1);

    Returns an anonymous function. The function can be used to iterate through the list of lists at intersecting points.

    Optional argument consolidate_ranges>(0||1)

    consolidate_ranges=>1 ( Default )
      calls Data::Range::Compare->consolidate_ranges(\%helper,\@list)
      on each \@list in \@list_of_lists
      before entering the compare process
    
    consolidate_ranges=>0 
      Skips the consolidate pass
  • my ($row,$cols,$next)=Data::Range::Compare->init_compare_row(\%helper, \@list_of_lists);

    This initializes the values for compare_row, producing the first row. See range_compare for a more practical iterator interface.

  • ($row,$cols,$next)=Data::Range::Compare->compare_row( \%helper, \@list_of_lists, $row, $cols ) if $next;

    Used to continue iteration through @list_of_lists while $next;

Sort Methods

This section documents the export-able sort functions. These are low level sort functions and must be used in a call to "sort".

Example:

@list=sort sort_in_presentation_order @list;
  • @list=sort sort_in_presentation_order @unsorted_list;

    Sorts a list of Data::Range::Compare objects in presentation order.

  • @list=sort sort_in_consolidate_order @unsorted_list;

    Sorts a list of Data::Range::Compare objects in the order required for range consolidation.

  • @list=sort sort_largest_range_end_first @unsorted_list;

    Sorts a list Data::Range::Compare objects by range_end in descending order.

  • @list=sort sort_smallest_range_start_first @unsorted_list;

    Sorts a list Data::Range::Compare objects by range_start in ascending order.

  • @list=sort sort_smallest_range_end_first @unsorted_list;

    Sorts a list Data::Range::Compare objects by range_end in ascending order.

  • @list=sort sort_largest_range_start_first @unsorted_list;

    Sorts a list Data::Range::Compare objects by range_start in descending order.

SEE ALSO

Data::Range::Compare::Cookbook

AUTHOR

Michael Shipper

SourceForge Project

As of version 1.026 the Project has been moved to SourceForge.net

Data Range Compare https://sourceforge.net/projects/data-range-comp/

COPYRIGHT

Copyright 2010 Michael Shipper. All rights reserved.

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.