1use std::{
2 fmt::{self, Debug},
3 ops::Index,
4};
5
6#[derive(Clone, PartialEq, Eq)]
39pub struct SortedSeq<T>(Vec<T>);
40
41impl<T> SortedSeq<T>
42where
43 T: Ord,
44{
45 pub fn new(mut values: Vec<T>) -> Self {
46 values.sort_unstable();
47 values.dedup();
48 Self(values)
49 }
50
51 pub fn ord(&self, value: &T) -> usize {
53 self.0
54 .binary_search(value)
55 .unwrap_or_else(|_| panic!("not found"))
56 }
57
58 pub fn at(&self, index: usize) -> Option<&T> {
74 self.0.get(index)
75 }
76
77 pub fn len(&self) -> usize {
79 self.0.len()
80 }
81
82 pub fn is_empty(&self) -> bool {
83 self.0.is_empty()
84 }
85
86 pub fn iter(&self) -> impl Iterator<Item = &T> {
87 self.0.iter()
88 }
89}
90
91impl<T> FromIterator<T> for SortedSeq<T>
92where
93 T: Ord,
94{
95 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
96 Self::new(iter.into_iter().collect())
97 }
98}
99
100impl<T> Index<usize> for SortedSeq<T> {
101 type Output = T;
102
103 fn index(&self, index: usize) -> &Self::Output {
104 &self.0[index]
105 }
106}
107
108impl<T> Debug for SortedSeq<T>
109where
110 T: Debug,
111{
112 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
113 write!(f, "{:?}", self.0)
114 }
115}
116
117#[cfg(test)]
118mod tests {
119 use crate::SortedSeq;
120
121 #[test]
122 fn ord_test() {
123 let seq = SortedSeq::new(vec![4, 4, 2, 5, 2, 9]);
124 assert_eq!(seq.ord(&2), 0);
126 assert_eq!(seq.ord(&4), 1);
127 assert_eq!(seq.ord(&5), 2);
128 assert_eq!(seq.ord(&9), 3);
129 }
130
131 #[test]
132 fn index_test() {
133 let seq = SortedSeq::new(vec![4, 4, 2, 5, 2, 9]);
134 assert_eq!(seq.at(0), Some(&2));
136 assert_eq!(seq.at(1), Some(&4));
137 assert_eq!(seq.at(2), Some(&5));
138 assert_eq!(seq.at(3), Some(&9));
139 assert_eq!(seq.at(4), None);
140 }
141
142 #[test]
143 #[should_panic]
144 fn not_found_test() {
145 let seq: SortedSeq<i32> = SortedSeq::new(vec![4, 4, 2, 5, 2, 9]);
146 seq.ord(&6);
147 }
148}