@@ -100,7 +100,7 @@ defmodule Date do
100
100
101
101
"""
102
102
@ doc since: "1.5.0"
103
- @ spec range ( Calendar . date ( ) , Calendar . date ( ) ) :: Date.Range . t ( )
103
+ @ spec range ( Calendar . date ( ) , Calendar . date ( ) | Duration . t ( ) ) :: Date.Range . t ( )
104
104
def range ( % { calendar: calendar } = first , % { calendar: calendar } = last ) do
105
105
{ first_days , _ } = to_iso_days ( first )
106
106
{ last_days , _ } = to_iso_days ( last )
@@ -119,6 +119,26 @@ defmodule Date do
119
119
range ( first , first_days , last , last_days , calendar , step )
120
120
end
121
121
122
+ def range ( % { calendar: calendar } = first , % Duration { } = duration ) do
123
+ last = shift ( first , duration )
124
+
125
+ { first_days , _ } = to_iso_days ( first )
126
+ { last_days , _ } = to_iso_days ( last )
127
+
128
+ step =
129
+ if first_days <= last_days do
130
+ 1
131
+ else
132
+ IO . warn (
133
+ "a negative range was inferred for Date.range/2, call Date.range/3 instead with -1 as third argument"
134
+ )
135
+
136
+ - 1
137
+ end
138
+
139
+ range ( first , first_days , last , last_days , calendar , step )
140
+ end
141
+
122
142
def range ( % { calendar: _ , year: _ , month: _ , day: _ } , % { calendar: _ , year: _ , month: _ , day: _ } ) do
123
143
raise ArgumentError , "both dates must have matching calendars"
124
144
end
@@ -140,7 +160,7 @@ defmodule Date do
140
160
141
161
"""
142
162
@ doc since: "1.12.0"
143
- @ spec range ( Calendar . date ( ) , Calendar . date ( ) , step :: pos_integer | neg_integer ) ::
163
+ @ spec range ( Calendar . date ( ) , Calendar . date ( ) | Duration . t ( ) , step :: pos_integer | neg_integer ) ::
144
164
Date.Range . t ( )
145
165
def range ( % { calendar: calendar } = first , % { calendar: calendar } = last , step )
146
166
when is_integer ( step ) and step != 0 do
@@ -149,6 +169,14 @@ defmodule Date do
149
169
range ( first , first_days , last , last_days , calendar , step )
150
170
end
151
171
172
+ def range ( % { calendar: calendar } = first , % Duration { } = duration , step ) do
173
+ last = shift ( first , duration )
174
+
175
+ { first_days , _ } = to_iso_days ( first )
176
+ { last_days , _ } = to_iso_days ( last )
177
+ range ( first , first_days , last , last_days , calendar , step )
178
+ end
179
+
152
180
def range (
153
181
% { calendar: _ , year: _ , month: _ , day: _ } = first ,
154
182
% { calendar: _ , year: _ , month: _ , day: _ } = last ,
0 commit comments