I basically opted to copy over $args{$unit} to a different array before doing any processing, and refactored one bit of code.
All existing tests passed.
--d
Index: lib/DateTime/Event/Recurrence.pm
===================================================================
RCS file: /cvsroot/perl-date-time/modules/DateTime-Event-Recurrence/lib/DateTime/Event/Recurrence.pm,v
retrieving revision 1.85
diff -d -u -r1.85 Recurrence.pm
--- lib/DateTime/Event/Recurrence.pm 22 Sep 2004 16:19:23 -0000 1.85
+++ lib/DateTime/Event/Recurrence.pm 8 Jan 2005 00:54:16 -0000
@@ -619,6 +619,15 @@
return $set;
}
+sub _sort_positive_first +{ + my @sorted = sort { $a <=> $b } @_; + # put positive values first + my @ret = grep { $_ >= 0 } @sorted; + push @ret, $_ for grep { $_ < 0 } @sorted; + + return @ret; +}
# method( hours => 10 ) # method( hours => 10, minutes => 30 ) @@ -676,8 +685,13 @@
next unless exists $args{$unit};
- $args{$unit} = [ $args{$unit} ] - unless ref( $args{$unit} ) eq 'ARRAY'; + # copy the argument values before proceeding, so that we + # don't accidentally modify it. + if (ref($args{$unit}) eq 'ARRAY') { + $args{$unit} = [ @{$args{$unit}} ]; + } else { + $args{$unit} = [ $args{$unit} ]; + }
# TODO: sort _after_ normalization
@@ -690,13 +704,7 @@ $_ } @{$args{$unit}}; } - @{$args{$unit}} = sort { $a <=> $b } @{$args{$unit}}; - # put positive values first - # warn "Arguments: $unit = @{$args{$unit}}"; - my @tmp = grep { $_ >= 0 } @{$args{$unit}}; - push @tmp, $_ for grep { $_ < 0 } @{$args{$unit}}; - # print STDERR "$unit => @tmp\n"; - @{$args{$unit}} = @tmp; + $args{$unit} = [ _sort_positive_first(@{$args{$unit}}) ];
$ical_string .= uc( ';' . $ical_name{$unit} . '=' . join(",", @{$args{$unit}} ) ) unless $unit eq 'nanoseconds';
@@ -755,14 +763,7 @@ }
# redo argument sort
-
- @{$args{$unit}} = sort { $a <=> $b } @{$args{$unit}};
- # put positive values first
- my @tmp = grep { $_ >= 0 } @{$args{$unit}};
- push @tmp, $_ for grep { $_ < 0 } @{$args{$unit}};
- # print STDERR "$unit => @tmp\n";
- @{$args{$unit}} = @tmp;
-
+ $args{$unit} = [ _sort_positive_first(@{$args{$unit}}) ];
}
else
{ # year day