DateTimeX-Lite

 view release on metacpan or  search on metacpan

lib/DateTimeX/Lite/Arithmetic.pm  view on Meta::CPAN

        if (! blessed $dur || !$dur->isa('DateTimeX::Lite::Duration')) {
            Carp::croak("Duration is not a DateTimeX::Lite::Duration object");
        }

        # simple optimization
        return $self if $dur->is_zero;

        my %deltas = $dur->deltas;

        # This bit isn't quite right since DateTimeX::Lite::Infinite::Future -
        # infinite duration should NaN
        foreach my $val ( values %deltas )
        {
            my $inf;
            if ( $val == &DateTimeX::Lite::INFINITY )
            {
                $inf = DateTimeX::Lite::Infinite::Future->new;
            }
            elsif ( $val == &DateTimeX::Lite::NEG_INFINITY )
            {
                $inf = DateTimeX::Lite::Infinite::Past->new;

lib/DateTimeX/Lite/Duration.pm  view on Meta::CPAN

               '-'   => '_subtract_overload',
               '*'   => '_multiply_overload',
               '<=>' => '_compare_overload',
               'cmp' => '_compare_overload',
             );

use constant MAX_NANOSECONDS => 1_000_000_000;  # 1E9 = almost 32 bits

my @all_units = qw( months days minutes seconds nanoseconds );

# XXX - need to reject non-integers but accept infinity, NaN, &
# 1.56e+18
sub new
{
    my ($class, %p) = @_;
    foreach my $field (qw(years months weeks days hours minutes seconds nanoseconds)) {
        $p{$field} = 0 unless defined $p{$field};
    }
        
=head1
    my %p = validate( @_,

t/20infinite.t  view on Meta::CPAN


    my $neg2 = $long_ago + $neg_dur;
    ok( $neg2 == $neg,
            'normal + neg infinite duration = neg infinity' );

    my $dur = $pos - $pos;
    my %deltas = $dur->deltas;
    my @compare = qw( days seconds nanoseconds );
    foreach (@compare)
    {
        # NaN != NaN (but should stringify the same)
        is( $deltas{$_} . '', $nan_string,
            "infinity - infinity = nan ($_)" );
    }

    my $new_pos = $pos->clone->add( days => 10 );
    ok( $new_pos == $pos,
            "infinity + normal duration = infinity" );

    my $new_pos2 = $pos->clone->subtract( days => 10 );
    ok( $new_pos2 == $pos,



( run in 0.244 second using v1.01-cache-2.11-cpan-fd5d4e115d8 )