Skip to content

Commit

Permalink
Handle Date.later a bit smarter
Browse files Browse the repository at this point in the history
Makes it 10% faster again
  • Loading branch information
lizmat committed Dec 26, 2015
1 parent 3cd19cf commit 1bdb784
Showing 1 changed file with 20 additions and 29 deletions.
49 changes: 20 additions & 29 deletions src/core/Date.pm
Original file line number Diff line number Diff line change
Expand Up @@ -81,36 +81,27 @@ my class Date does Dateish {
$amount = -$amount if $earlier;

my $date;
given $unit {

my $day-delta;
when 'day' | 'days' { $day-delta = $amount; proceed }
when 'week' | 'weeks' { $day-delta = 7 * $amount; proceed }

when 'month' | 'months' {
my int $month = $!month;
my int $year = $!year;
$month += $amount;
$year += floor(($month - 1) / 12);
$month = ($month - 1) % 12 + 1;
# If we overflow on days in the month, rather than throw an
# exception, we just clip to the last of the month
$date = Date.new($year,$month,$!day > 28
?? $!day min self!DAYS-IN-MONTH($year,$month)
!! $!day);
succeed;
}

when 'year' | 'years' {
my int $year = $!year + $amount;
$date = Date.new($year,$!month,$!day > 28
?? $!day min self!DAYS-IN-MONTH($year,$!month)
!! $!day);
succeed;
}
$date = self.new-from-daycount(self.daycount + $day-delta);
if nqp::atkey($valid-units,$unit) -> $multiplier {
self.new-from-daycount(self.daycount + $multiplier * $amount )
}
elsif $unit.starts-with('month') {
my int $month = $!month;
my int $year = $!year;
$month += $amount;
$year += floor(($month - 1) / 12);
$month = ($month - 1) % 12 + 1;
# If we overflow on days in the month, rather than throw an
# exception, we just clip to the last of the month
Date.new($year,$month,$!day > 28
?? $!day min self!DAYS-IN-MONTH($year,$month)
!! $!day);
}
else { # year
my int $year = $!year + $amount;
Date.new($year,$!month,$!day > 28
?? $!day min self!DAYS-IN-MONTH($year,$!month)
!! $!day);
}
$date;
}

method clone(*%_) {
Expand Down

0 comments on commit 1bdb784

Please sign in to comment.