File Coverage

blib/lib/Time/Moment/Adjusters.pm
Criterion Covered Total %
statement 86 90 95.5
branch 22 44 50.0
condition 11 33 33.3
subroutine 25 27 92.5
pod 11 11 100.0
total 155 205 75.6


line stmt bran cond sub pod time code
1             package Time::Moment::Adjusters;
2 1     1   1550 use strict;
  1         2  
  1         42  
3 1     1   5 use warnings;
  1         2  
  1         60  
4              
5 1     1   6 use Carp qw[];
  1         2  
  1         143  
6              
7             BEGIN {
8 1     1   5 our $VERSION = '0.46';
9 1         4 our @EXPORT_OK = qw[ NextDayOfWeek
10             NextOrSameDayOfWeek
11             PreviousDayOfWeek
12             PreviousOrSameDayOfWeek
13             NearestDayOfWeek
14             FirstDayOfWeekInMonth
15             LastDayOfWeekInMonth
16             NthDayOfWeekInMonth
17             WesternEasterSunday
18             OrthodoxEasterSunday
19             NearestMinuteInterval ];
20              
21 1         5 our %EXPORT_TAGS = (
22             all => [ @EXPORT_OK ],
23             );
24              
25 1         6 require Exporter;
26 1         1622 *import = \&Exporter::import;
27             }
28              
29             sub NextDayOfWeek {
30 49 50   49 1 298626 @_ == 1 or Carp::croak(q);
31 49         112 my ($day) = @_;
32              
33 49 50 33     257 ($day >= 1 && $day <= 7)
34             or Carp::croak(q);
35              
36             return sub {
37 49     49   105 my ($tm) = @_;
38 49         471 return $tm->plus_days(($day - $tm->day_of_week + 6) % 7 + 1);
39 49         447 };
40             }
41              
42             sub NextOrSameDayOfWeek {
43 49 50   49 1 51417 @_ == 1 or Carp::croak(q);
44 49         150 my ($day) = @_;
45              
46 49 50 33     285 ($day >= 1 && $day <= 7)
47             or Carp::croak(q);
48              
49             return sub {
50 49     49   109 my ($tm) = @_;
51 49         399 return $tm->plus_days(($day - $tm->day_of_week) % 7);
52 49         440 };
53             }
54              
55             sub PreviousDayOfWeek {
56 49 50   49 1 53442 @_ == 1 or Carp::croak(q);
57 49         152 my ($day) = @_;
58              
59 49 50 33     359 ($day >= 1 && $day <= 7)
60             or Carp::croak(q);
61              
62             return sub {
63 49     49   99 my ($tm) = @_;
64 49         441 return $tm->minus_days(($tm->day_of_week - $day + 6) % 7 + 1);
65 49         460 };
66             }
67              
68             sub PreviousOrSameDayOfWeek {
69 49 50   49 1 48548 @_ == 1 or Carp::croak(q);
70 49         139 my ($day) = @_;
71              
72 49 50 33     312 ($day >= 1 && $day <= 7)
73             or Carp::croak(q);
74              
75             return sub {
76 49     49   107 my ($tm) = @_;
77 49         452 return $tm->minus_days(($tm->day_of_week - $day) % 7);
78 49         438 };
79             }
80              
81             sub NearestDayOfWeek {
82 9 50   9 1 4965 @_ == 1 or Carp::croak(q);
83 9         15 my ($day) = @_;
84              
85 9 50 33     35 ($day >= 1 && $day <= 7)
86             or Carp::croak(q);
87              
88             return sub {
89 9     9   11 my ($tm) = @_;
90 9         57 return $tm->plus_days((($day - $tm->day_of_week + 3) % 7) - 3);
91 9         51 };
92             }
93              
94             sub FirstDayOfWeekInMonth {
95 2562 50   2562 1 6868474 @_ == 1 or Carp::croak(q);
96 2562         9421 my ($day) = @_;
97              
98 2562 50 33     14258 ($day >= 1 && $day <= 7)
99             or Carp::croak(q);
100              
101             return sub {
102 2562     2562   10438 my ($tm) = @_;
103 2562         16017 $tm = $tm->with_day_of_month(1);
104 2562         18606 return $tm->plus_days(($day - $tm->day_of_week) % 7);
105 2562         22998 };
106             }
107              
108             sub LastDayOfWeekInMonth {
109 2562 50   2562 1 6458692 @_ == 1 or Carp::croak(q);
110 2562         6913 my ($day) = @_;
111              
112 2562 50 33     13932 ($day >= 1 && $day <= 7)
113             or Carp::croak(q);
114              
115             return sub {
116 2562     2562   5898 my ($tm) = @_;
117 2562         14881 $tm = $tm->at_last_day_of_month;
118 2562         18223 return $tm->minus_days(($tm->day_of_week - $day) % 7);
119 2562         22734 };
120             }
121              
122             sub NthDayOfWeekInMonth {
123 672 50   672 1 1878036 @_ == 2 or Carp::croak(q);
124 672         1867 my ($ordinal, $day) = @_;
125              
126 672 50 33     4742 ($ordinal >= -4 && $ordinal <= 4 && $ordinal != 0)
      33        
127             or Carp::croak(q);
128              
129 672 50 33     2272 ($day >= 1 && $day <= 7)
130             or Carp::croak(q);
131              
132 672 100       1472 if ($ordinal > 0) {
133 336         646 my $days = 7 * --$ordinal;
134             return sub {
135 336     336   757 my ($tm) = @_;
136 336         1838 $tm = $tm->with_day_of_month(1);
137 336         2582 return $tm->plus_days($days + ($day - $tm->day_of_week) % 7);
138 336         3068 };
139             }
140             else {
141 336         752 my $days = 7 * ++$ordinal;
142             return sub {
143 336     336   763 my ($tm) = @_;
144 336         2090 $tm = $tm->at_last_day_of_month;
145 336         2582 return $tm->plus_days($days - ($tm->day_of_week - $day) % 7);
146 336         3253 };
147             }
148             }
149              
150             sub WesternEasterSunday {
151 500 50   500 1 333485 @_ == 0 or Carp::croak(q);
152              
153             return sub {
154 500     500   916 my ($tm) = @_;
155 500         2885 return $tm->with_rdn(Time::Moment::Internal::western_easter_sunday($tm->year));
156 500         3198 };
157             }
158              
159             sub OrthodoxEasterSunday {
160 0 0   0 1 0 @_ == 0 or Carp::croak(q);
161              
162             return sub {
163 0     0   0 my ($tm) = @_;
164 0         0 return $tm->with_rdn(Time::Moment::Internal::orthodox_easter_sunday($tm->year));
165 0         0 };
166             }
167              
168             sub NearestMinuteInterval {
169 7 50   7 1 4100 @_ == 1 or Carp::croak(q);
170 7         10 my ($interval) = @_;
171            
172 7 50 33     27 ($interval >= 1 && $interval <= 1440)
173             or Carp::croak(q);
174            
175 7         10 my $msec = $interval * 60 * 1000;
176 7         17 my $mid = int(($msec + 1) / 2);
177             return sub {
178 7     7   8 my ($tm) = @_;
179 7         23 my $msod = $msec * int(($tm->millisecond_of_day + $mid) / $msec);
180 7         23 return $tm->with_millisecond_of_day($msod);
181 7         38 };
182             }
183              
184             1;
185