@@ -26,13 +26,15 @@ defmodule Date.Range do
2626 defstruct [ :first , :last , :first_in_iso_days , :last_in_iso_days , :step ]
2727
2828 defimpl Enumerable do
29- def member? ( % { first: % { calendar: calendar } } = range , % Date { calendar: calendar } = date ) do
30- % {
31- first_in_iso_days: first_days ,
32- last_in_iso_days: last_days ,
33- step: step
34- } = range
35-
29+ def member? (
30+ % Date.Range {
31+ first: % { calendar: calendar } ,
32+ first_in_iso_days: first_days ,
33+ last_in_iso_days: last_days ,
34+ step: step
35+ } = range ,
36+ % Date { calendar: calendar } = date
37+ ) do
3638 { days , _ } = Date . to_iso_days ( date )
3739
3840 cond do
@@ -47,24 +49,43 @@ defmodule Date.Range do
4749 end
4850 end
4951
50- def member? ( _ , _ ) do
52+ def member? ( % Date.Range { step: _ } , _ ) do
5153 { :ok , false }
5254 end
5355
56+ # TODO: Remove me on v2.0
57+ def member? (
58+ % { __struct__: Date.Range , first_in_iso_days: first_days , last_in_iso_days: last_days } =
59+ date_range ,
60+ date
61+ ) do
62+ step = if first_days <= last_days , do: 1 , else: - 1
63+ member? ( Map . put ( date_range , :step , step ) , date )
64+ end
65+
5466 def count ( range ) do
5567 { :ok , size ( range ) }
5668 end
5769
58- def slice ( range ) do
59- % {
60- first_in_iso_days: first ,
61- first: % { calendar: calendar } ,
62- step: step
63- } = range
64-
70+ def slice (
71+ % Date.Range {
72+ first_in_iso_days: first ,
73+ first: % { calendar: calendar } ,
74+ step: step
75+ } = range
76+ ) do
6577 { :ok , size ( range ) , & slice ( first + & 1 * step , step , & 2 , calendar ) }
6678 end
6779
80+ # TODO: Remove me on v2.0
81+ def slice (
82+ % { __struct__: Date.Range , first_in_iso_days: first_days , last_in_iso_days: last_days } =
83+ date_range
84+ ) do
85+ step = if first_days <= last_days , do: 1 , else: - 1
86+ slice ( Map . put ( date_range , :step , step ) )
87+ end
88+
6889 defp slice ( current , _step , 1 , calendar ) do
6990 [ date_from_iso_days ( current , calendar ) ]
7091 end
@@ -76,17 +97,30 @@ defmodule Date.Range do
7697 ]
7798 end
7899
79- def reduce ( range , acc , fun ) do
80- % {
81- first_in_iso_days: first_days ,
82- last_in_iso_days: last_days ,
83- first: % { calendar: calendar } ,
84- step: step
85- } = range
86-
100+ def reduce (
101+ % Date.Range {
102+ first_in_iso_days: first_days ,
103+ last_in_iso_days: last_days ,
104+ first: % { calendar: calendar } ,
105+ step: step
106+ } ,
107+ acc ,
108+ fun
109+ ) do
87110 reduce ( first_days , last_days , acc , fun , step , calendar )
88111 end
89112
113+ # TODO: Remove me on v2.0
114+ def reduce (
115+ % { __struct__: Date.Range , first_in_iso_days: first_days , last_in_iso_days: last_days } =
116+ date_range ,
117+ acc ,
118+ fun
119+ ) do
120+ step = if first_days <= last_days , do: 1 , else: - 1
121+ reduce ( Map . put ( date_range , :step , step ) , acc , fun )
122+ end
123+
90124 defp reduce ( _first_days , _last_days , { :halt , acc } , _fun , _step , _calendar ) do
91125 { :halted , acc }
92126 end
@@ -135,6 +169,15 @@ defmodule Date.Range do
135169 defp size ( % Date.Range { first_in_iso_days: first_days , last_in_iso_days: last_days , step: step } ) ,
136170 do: abs ( div ( last_days - first_days , step ) ) + 1
137171
172+ # TODO: Remove me on v2.0
173+ defp size (
174+ % { __struct__: Date.Range , first_in_iso_days: first_days , last_in_iso_days: last_days } =
175+ date_range
176+ ) do
177+ step = if first_days <= last_days , do: 1 , else: - 1
178+ size ( Map . put ( date_range , :step , step ) )
179+ end
180+
138181 defp empty? ( % Date.Range {
139182 first_in_iso_days: first_days ,
140183 last_in_iso_days: last_days ,
@@ -151,16 +194,33 @@ defmodule Date.Range do
151194 when step < 0 and first_days < last_days ,
152195 do: true
153196
154- defp empty? ( % Date.Range { } ) , do: false
197+ defp empty? ( % Date.Range { step: _ } ) , do: false
198+
199+ # TODO: Remove me on v2.0
200+ defp empty? (
201+ % { __struct__: Date.Range , first_in_iso_days: first_days , last_in_iso_days: last_days } =
202+ date_range
203+ ) do
204+ step = if first_days <= last_days , do: 1 , else: - 1
205+ empty? ( Map . put ( date_range , :step , step ) )
206+ end
155207 end
156208
157209 defimpl Inspect do
210+ import Kernel , except: [ inspect: 2 ]
211+
158212 def inspect ( % Date.Range { first: first , last: last , step: 1 } , _ ) do
159213 "#DateRange<" <> inspect ( first ) <> ", " <> inspect ( last ) <> ">"
160214 end
161215
162216 def inspect ( % Date.Range { first: first , last: last , step: step } , _ ) do
163217 "#DateRange<" <> inspect ( first ) <> ", " <> inspect ( last ) <> ", #{ step } >"
164218 end
219+
220+ # TODO: Remove me on v2.0
221+ def inspect ( % { __struct__: Date.Range , first: first , last: last } = date_range , opts ) do
222+ step = if first <= last , do: 1 , else: - 1
223+ inspect ( Map . put ( date_range , :step , step ) , opts )
224+ end
165225 end
166226end
0 commit comments