diff --git a/src/histbuf.rs b/src/histbuf.rs index cc4b4922ef..68ddf58a98 100644 --- a/src/histbuf.rs +++ b/src/histbuf.rs @@ -504,6 +504,32 @@ impl + ?Sized> HistoryBufferInner { } } + /// Returns a reference to the element in the order from oldest to newest. + /// + /// `buf.ordered_get(0)` will always return the oldest element in the buffer. + /// + /// `buf.ordered_get(buf.len() - 1)` will always return the newest element + /// in the buffer. + /// + /// Returns None if `index >= self.len()`. + /// + /// # Examples + /// + /// ``` + /// use heapless::HistoryBuffer; + /// + /// let mut buffer: HistoryBuffer = HistoryBuffer::new(); + /// buffer.extend([0, 0, 0]); + /// buffer.extend([1, 2, 3, 4, 5, 6]); + /// assert_eq!(buffer.ordered_get(0), Some(&1u8)); + /// assert_eq!(buffer.ordered_get(1), Some(&2u8)); + /// assert_eq!(buffer.ordered_get(2), Some(&3u8)); + /// assert_eq!(buffer.ordered_get(6), None); + /// ``` + pub fn ordered_get(&self, idx: usize) -> Option<&T> { + self.oldest_ordered().nth(idx) + } + /// Returns double ended iterator for iterating over the buffer from /// the oldest to the newest and back. /// @@ -855,6 +881,24 @@ mod tests { } } + #[test] + fn ordered_get() { + let mut buffer: HistoryBuffer = HistoryBuffer::new(); + assert_eq!(buffer.ordered_get(0), None); + + buffer.write(1u8); + assert_eq!(buffer.ordered_get(0), Some(&1u8)); + + buffer.write(2u8); + assert_eq!(buffer.ordered_get(0), Some(&1u8)); + assert_eq!(buffer.ordered_get(1), Some(&2u8)); + + buffer.extend([3, 4, 5, 6, 7, 8]); + assert_eq!(buffer.ordered_get(0), Some(&3u8)); + assert_eq!(buffer.ordered_get(5), Some(&8u8)); + assert_eq!(buffer.ordered_get(6), None); + } + #[test] fn ordered() { // test on an empty buffer