@@ -203,8 +203,7 @@ where
203203 /// assert_eq!(series.first_event(), Some(Event::at(date(2025, 1, 1).at(0, 0, 0, 0))));
204204 /// ```
205205 pub fn first_event ( & self ) -> Option < Event > {
206- self . get_event ( self . range . start )
207- . or_else ( || self . get_event_after ( self . range . start ) )
206+ self . get_closest_event ( self . range . start )
208207 }
209208
210209 /// Gets the last event in the series.
@@ -263,12 +262,10 @@ where
263262 /// assert!(series.get_event(date(2026, 12, 31).at(14, 0, 0, 0)).is_some());
264263 /// ```
265264 pub fn get_event ( & self , instant : DateTime ) -> Option < Event > {
266- let closest = self . closest_to ( instant) ?;
267- if closest == instant {
268- return self . get_event_unchecked ( instant) ;
269- }
270-
271- None
265+ self . pattern
266+ . closest_to ( instant, self . range )
267+ . filter ( |& start| start == instant)
268+ . and_then ( |start| self . get_event_unchecked ( start) )
272269 }
273270
274271 /// Gets the event containing `instant`.
@@ -312,8 +309,11 @@ where
312309 /// # Ok::<(), Box<dyn core::error::Error>>(())
313310 /// ```
314311 pub fn get_event_containing ( & self , instant : DateTime ) -> Option < Event > {
315- self . get_event ( instant)
316- . or_else ( || self . get_event_before ( instant) )
312+ self . pattern
313+ . closest_to ( instant, self . range )
314+ . filter ( |& start| start <= instant)
315+ . or_else ( || self . pattern . previous_before ( instant, self . range ) )
316+ . and_then ( |start| self . get_event_unchecked ( start) )
317317 . filter ( |event| event. contains ( instant) )
318318 }
319319
@@ -359,7 +359,8 @@ where
359359 /// # Ok::<(), Box<dyn core::error::Error>>(())
360360 /// ```
361361 pub fn get_event_after ( & self , instant : DateTime ) -> Option < Event > {
362- self . next_after ( instant)
362+ self . pattern
363+ . next_after ( instant, self . range )
363364 . and_then ( |next| self . get_event_unchecked ( next) )
364365 }
365366
@@ -396,7 +397,8 @@ where
396397 /// );
397398 /// ```
398399 pub fn get_event_before ( & self , instant : DateTime ) -> Option < Event > {
399- self . previous_before ( instant)
400+ self . pattern
401+ . previous_before ( instant, self . range )
400402 . and_then ( |previous| self . get_event_unchecked ( previous) )
401403 }
402404
@@ -431,7 +433,8 @@ where
431433 /// );
432434 /// ```
433435 pub fn get_closest_event ( & self , instant : DateTime ) -> Option < Event > {
434- self . closest_to ( instant)
436+ self . pattern
437+ . closest_to ( instant, self . range )
435438 . and_then ( |closest| self . get_event_unchecked ( closest) )
436439 }
437440}
@@ -441,24 +444,6 @@ impl<P> Series<P>
441444where
442445 P : Pattern ,
443446{
444- /// Find the next `DateTime` after `instant` within the series.
445- #[ inline]
446- fn next_after ( & self , instant : DateTime ) -> Option < DateTime > {
447- self . pattern . next_after ( instant, self . range )
448- }
449-
450- /// Find the previous `DateTime` before `instant` within the series.
451- #[ inline]
452- fn previous_before ( & self , instant : DateTime ) -> Option < DateTime > {
453- self . pattern . previous_before ( instant, self . range )
454- }
455-
456- /// Find a `DateTime` closest to `instant` within the series.
457- #[ inline]
458- fn closest_to ( & self , instant : DateTime ) -> Option < DateTime > {
459- self . pattern . closest_to ( instant, self . range )
460- }
461-
462447 /// Get an event without any bound checks. The datetime at `start` is assumed to be aligned to
463448 /// the series and within the series start and end bounds.
464449 #[ inline]
0 commit comments