Rick Measham wrote:
> 
> I'm trying to get next/previous spans from a given DateTime. I'm
> defining next/previous as the event who started before or after $dt.
> Where it ends doesn't matter, even if we're still in the middle of the
> event.

Here is an example (tested):
---
use strict;
use DateTime::Span;

# build a spanset
my $span1 = DateTime::Span->new(
    start => DateTime->new( year => 2000 ),
    end   => DateTime->new( year => 2003 ) );
my $span2 = DateTime::Span->new(
    start => DateTime->new( year => 2006 ),
    end   => DateTime->new( year => 2009 ) );
my $span3 = DateTime::Span->new(
    start => DateTime->new( year => 2012 ),
    end   => DateTime->new( year => 2015 ) );
my $spanset = $span1->union( $span2 )->union( $span3 );
print "SpanSet ".$spanset->{set}."\n";
print "\n";

my $dt = DateTime->new( year => 2005 );

for ( 1 .. 3 )
{
  print "dt: ".$dt->datetime."\n";
  my $after  = DateTime::Span->new( start => $dt );
  my $before = DateTime::Span->new( end => $dt );

  my $next =     $after->intersection( $spanset )->next;
  my $previous = $before->intersection( $spanset )->previous;

  print "next:     ".$next->{set}."\n";
  print "previous: ".$previous->{set}."\n";
  print "\n";

  $dt->add( years => 3 );
}
---
SpanSet
[2000-01-01T00:00:00..2003-01-01T00:00:00],[2006-01-01T00:00:00..2009-01-01T00:00:00],[2012-01-01T00:00:00..2015-01-01T00:00:00]

dt: 2005-01-01T00:00:00
next:     [2006-01-01T00:00:00..2009-01-01T00:00:00]
previous: [2000-01-01T00:00:00..2003-01-01T00:00:00]

dt: 2008-01-01T00:00:00
next:     [2008-01-01T00:00:00..2009-01-01T00:00:00]
previous: [2006-01-01T00:00:00..2008-01-01T00:00:00]

dt: 2011-01-01T00:00:00
next:     [2012-01-01T00:00:00..2015-01-01T00:00:00]
previous: [2006-01-01T00:00:00..2009-01-01T00:00:00]
---

> All the above takes time. Seconds in fact! 

It was not noticeably slow here. Would you test this?

> Surely there's a better way
> ... I'd really like to have $spanset->next_span($dt) and
> $spanset->previous_span($dt) but if there's some way to do it myself
> that is better than what I'm doing I'd love to know.

DT::SpanSet misses all these methods:
  next( $dt )
  previous( $dt )
  current( $dt )
  closest( $dt )
  as_list

Is it ok to implement this in DT::SpanSet?

- Flavio S. Glock

Reply via email to