The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

use lib qw(../lib);

use Data::Range::Compare::Stream;
use Data::Range::Compare::Stream::Iterator::Array;
use Data::Range::Compare::Stream::Iterator::Consolidate;
use Data::Range::Compare::Stream::Iterator::Compare::Asc;

# create the iterator for column_a's Consolidation iterator
my $column_a=Data::Range::Compare::Stream::Iterator::Array->new();
$column_a->create_range(3,11);
$column_a->create_range(17,19);

# create the iterator for column_b's Consolidation iterator
my $column_b=Data::Range::Compare::Stream::Iterator::Array->new();
$column_b->create_range(0,0);
$column_b->create_range(1,3);
$column_b->create_range(5,7);
$column_b->create_range(6,9);
$column_b->create_range(11,15);
$column_b->create_range(17,33);

# sort columns a and be in consolidate order
$column_a->prepare_for_consolidate_asc;
$column_b->prepare_for_consolidate_asc;

# create the consolidator object for column_a our iterator to it
my $column_a_consolidator=Data::Range::Compare::Stream::Iterator::Consolidate->new($column_a);

# create the consolidator object for column_b our iterator to it
my $column_b_consolidator=Data::Range::Compare::Stream::Iterator::Consolidate->new($column_b);

# create the object that will compare columns a and b
my $compare=new Data::Range::Compare::Stream::Iterator::Compare::Asc;

# add column a for processing
$compare->add_consolidator($column_a_consolidator);

# add column b for processing
$compare->add_consolidator($column_b_consolidator);


# now we can compute the intersections of our objects

while($compare->has_next) {

  # fetch our current result object
  my $row=$compare->get_next;

  # if no ranges overlap with this row move on
  next if $row->is_empty;

  # now we can output the current range
  my $common_range=$row->get_common;
  my $overlap_count=$row->get_overlap_count;

  print "A total of: [$overlap_count] Ranges intersected with Common range: $common_range\n";

  my $overlap_ids=$row->get_overlap_ids;
  foreach my $consolidator_id (@{$overlap_ids}) {

    if($consolidator_id==0) {

      my $result=$row->get_consolidator_result_by_id($consolidator_id);
      print "  Column a contained the following overlaps $result\n";

    } elsif($consolidator_id==1) {

      my $result=$row->get_consolidator_result_by_id($consolidator_id);
      print "  Column b contained the following overlaps $result\n";

    }

  }

  print "\n";
  
}