@@ -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