Skip to content

Commit dd75fc0

Browse files
Implementiert Funktionen um Zeiträume zu vergleichen und zu sortieren.
1 parent 2fb79e9 commit dd75fc0

File tree

1 file changed

+119
-1
lines changed

1 file changed

+119
-1
lines changed

lib/zeitraum.ex

Lines changed: 119 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,125 @@ defmodule Shared.Zeitraum do
152152
end
153153
end
154154

155+
@doc """
156+
Testet ob der beginn des ersten Zeitraums vor dem des zweiten liegt.
157+
158+
## Beispiel
159+
160+
iex> beginnt_vor?(~D[2025-01-01], ~D[2025-01-02])
161+
true
162+
163+
iex> beginnt_vor?(~D[2025-01-02], ~D[2025-01-01])
164+
false
165+
166+
iex> beginnt_vor?(~m[2025-01], ~D[2025-01-01])
167+
false
168+
"""
169+
@spec beginnt_vor?(t(), t()) :: boolean()
170+
def beginnt_vor?(%Timex.Interval{left_open: lo} = a, %Timex.Interval{left_open: lo} = b),
171+
do: NaiveDateTime.before?(a.from, b.from)
172+
173+
def beginnt_vor?(a, b), do: beginnt_vor?(als_intervall(a), als_intervall(b))
174+
175+
@doc """
176+
Testet ob der beginn des ersten Zeitraums nach dem des zweiten liegt.
177+
178+
## Beispiel
179+
180+
iex> beginnt_nach?(~D[2025-01-01], ~D[2025-01-02])
181+
false
182+
183+
iex> beginnt_nach?(~D[2025-01-02], ~D[2025-01-01])
184+
true
185+
186+
iex> beginnt_nach?(~m[2025-01], ~D[2025-01-01])
187+
false
188+
"""
189+
@spec beginnt_nach?(t(), t()) :: boolean()
190+
def beginnt_nach?(%Timex.Interval{left_open: lo} = a, %Timex.Interval{left_open: lo} = b),
191+
do: NaiveDateTime.after?(a.from, b.from)
192+
193+
def beginnt_nach?(a, b), do: beginnt_nach?(als_intervall(a), als_intervall(b))
194+
195+
@doc """
196+
Testet ob das Ende des ersten Zeitraums vor dem des zweiten liegt.
197+
198+
## Beispiel
199+
200+
iex> endet_vor?(~D[2025-01-01], ~D[2025-01-02])
201+
true
202+
203+
iex> endet_vor?(~D[2025-01-02], ~D[2025-01-01])
204+
false
205+
206+
iex> endet_vor?(~m[2025-01], ~D[2025-01-31])
207+
false
208+
"""
209+
@spec endet_vor?(t(), t()) :: boolean()
210+
def endet_vor?(%Timex.Interval{right_open: ro} = a, %Timex.Interval{right_open: ro} = b),
211+
do: NaiveDateTime.before?(a.until, b.until)
212+
213+
def endet_vor?(a, b), do: endet_vor?(als_intervall(a), als_intervall(b))
214+
215+
@doc """
216+
Testet ob das Ende des ersten Zeitraums nach dem des zweiten liegt.
217+
218+
## Beispiel
219+
220+
iex> endet_nach?(~D[2025-01-01], ~D[2025-01-02])
221+
false
222+
223+
iex> endet_nach?(~D[2025-01-02], ~D[2025-01-01])
224+
true
225+
226+
iex> endet_nach?(~m[2025-01], ~D[2025-01-31])
227+
false
228+
"""
229+
@spec endet_nach?(t(), t()) :: boolean()
230+
def endet_nach?(%Timex.Interval{right_open: ro} = a, %Timex.Interval{right_open: ro} = b),
231+
do: NaiveDateTime.after?(a.until, b.until)
232+
233+
def endet_nach?(a, b), do: endet_nach?(als_intervall(a), als_intervall(b))
234+
235+
@doc """
236+
Vergleicht zwei Zeiträume zuerst nach Start und dann nach Ende.
237+
238+
Kann auch benutzt werden um Zeiträume in einer Liste zu sortieren.
239+
240+
## Beispiel
241+
242+
iex> Enum.sort([
243+
...> ~m[2025-05],
244+
...> ~D[2025-05-20],
245+
...> Shared.Week.from_day!(~D[2025-05-01]),
246+
...> Shared.Week.from_day!(~D[2025-05-31]),
247+
...> Date.range(~D[2025-05-19], ~D[2025-05-20])
248+
...> ], Shared.Zeitraum)
249+
[~v[2025-18], ~m[2025-05], Date.range(~D[2025-05-19], ~D[2025-05-20]), ~D[2025-05-20], ~v[2025-22]]
250+
251+
"""
252+
@spec compare(t(), t()) :: :lt | :eq | :gt
253+
def compare(
254+
%Timex.Interval{left_open: lo, right_open: ro} = a,
255+
%Timex.Interval{left_open: lo, right_open: ro} = b
256+
) do
257+
with :eq <- NaiveDateTime.compare(a.from, b.from) do
258+
NaiveDateTime.compare(a.until, b.until)
259+
end
260+
end
261+
262+
def compare(%Timex.Interval{}, %Timex.Interval{}) do
263+
raise ArgumentError, "Cannot compare intervals with different open/closed status"
264+
end
265+
266+
def compare(%type{} = a, %type{} = b) do
267+
if function_exported?(type, :compare, 2),
268+
do: type.compare(a, b),
269+
else: compare(als_intervall(a), als_intervall(b))
270+
end
271+
272+
def compare(a, b), do: compare(als_intervall(a), als_intervall(b))
273+
155274
@doc """
156275
Sigil zur Erstellung von Zeiträumen.
157276
@@ -161,7 +280,6 @@ defmodule Shared.Zeitraum do
161280
> Während Date-, Week- & Month-Ranges end inclusive sind (right-closed),
162281
> sind NaiveDateTime-Ranges end exclusive (right-open).
163282
164-
165283
## Beispiel
166284
167285
iex> ~Z[2025-01/2025-02]

0 commit comments

Comments
 (0)