diff --git a/libs/zarts/src/lib.rs b/libs/zarts/src/lib.rs index c72e915e..2f932998 100644 --- a/libs/zarts/src/lib.rs +++ b/libs/zarts/src/lib.rs @@ -17,10 +17,11 @@ use std::{ /// assert_eq!(seq.ord(&2), 2); /// assert_eq!(seq.ord(&5), 3); /// -/// assert_eq!(seq.at(0), &(-3)); -/// assert_eq!(seq.at(1), &(-1)); -/// assert_eq!(seq.at(2), &2); -/// assert_eq!(seq.at(3), &5); +/// assert_eq!(seq.at(0), Some(&(-3))); +/// assert_eq!(seq.at(1), Some(&(-1))); +/// assert_eq!(seq.at(2), Some(&2)); +/// assert_eq!(seq.at(3), Some(&5)); +/// assert_eq!(seq.at(4), None); /// ``` /// /// # Panics @@ -34,15 +35,7 @@ use std::{ /// seq.ord(&4); /// ``` /// -/// index が集合のサイズ以上だとパニックです。 -/// -/// ```should_panic -/// use zarts::SortedSeq; -/// let values = vec![1, 1, 2, 2, 3, 4, 9, 9]; -/// let seq = SortedSeq::new(values); -/// seq.at(5); -/// ``` -/// +#[derive(Clone, PartialEq, Eq)] pub struct SortedSeq(Vec); impl SortedSeq @@ -63,8 +56,22 @@ where } /// index 番目の値を返します - pub fn at(&self, index: usize) -> &T { - &self[index] + /// + /// # Examples + /// + /// ``` + /// use zarts::SortedSeq; + /// + /// let seq = SortedSeq::new(vec![4, 16, 9, 1]); + /// // 1, 4, 9, 16 + /// assert_eq!(seq.at(0), Some(&1)); + /// assert_eq!(seq.at(1), Some(&4)); + /// assert_eq!(seq[2], 9); + /// assert_eq!(seq[3], 16); + /// assert_eq!(seq.at(4), None); + /// ``` + pub fn at(&self, index: usize) -> Option<&T> { + self.0.get(index) } /// 集合のサイズを返します @@ -75,6 +82,10 @@ where pub fn is_empty(&self) -> bool { self.0.is_empty() } + + pub fn iter(&self) -> impl Iterator { + self.0.iter() + } } impl FromIterator for SortedSeq @@ -121,10 +132,11 @@ mod tests { fn index_test() { let seq = SortedSeq::new(vec![4, 4, 2, 5, 2, 9]); // 2, 4, 5, 9 - assert_eq!(seq.at(0), &2); - assert_eq!(seq.at(1), &4); - assert_eq!(seq.at(2), &5); - assert_eq!(seq.at(3), &9); + assert_eq!(seq.at(0), Some(&2)); + assert_eq!(seq.at(1), Some(&4)); + assert_eq!(seq.at(2), Some(&5)); + assert_eq!(seq.at(3), Some(&9)); + assert_eq!(seq.at(4), None); } #[test]