1use std::{
2 fmt::{self, Debug},
3 ops::Index,
4};
5
6pub struct SortedSeq<T>(Vec<T>);
47
48impl<T> SortedSeq<T>
49where
50 T: Ord,
51{
52 pub fn new(mut values: Vec<T>) -> Self {
53 values.sort_unstable();
54 values.dedup();
55 Self(values)
56 }
57
58 pub fn ord(&self, value: &T) -> usize {
60 self.0
61 .binary_search(value)
62 .unwrap_or_else(|_| panic!("not found"))
63 }
64
65 pub fn at(&self, index: usize) -> &T {
67 &self[index]
68 }
69
70 pub fn len(&self) -> usize {
72 self.0.len()
73 }
74
75 pub fn is_empty(&self) -> bool {
76 self.0.is_empty()
77 }
78}
79
80impl<T> FromIterator<T> for SortedSeq<T>
81where
82 T: Ord,
83{
84 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
85 Self::new(iter.into_iter().collect())
86 }
87}
88
89impl<T> Index<usize> for SortedSeq<T> {
90 type Output = T;
91
92 fn index(&self, index: usize) -> &Self::Output {
93 &self.0[index]
94 }
95}
96
97impl<T> Debug for SortedSeq<T>
98where
99 T: Debug,
100{
101 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
102 write!(f, "{:?}", self.0)
103 }
104}
105
106#[cfg(test)]
107mod tests {
108 use crate::SortedSeq;
109
110 #[test]
111 fn ord_test() {
112 let seq = SortedSeq::new(vec![4, 4, 2, 5, 2, 9]);
113 assert_eq!(seq.ord(&2), 0);
115 assert_eq!(seq.ord(&4), 1);
116 assert_eq!(seq.ord(&5), 2);
117 assert_eq!(seq.ord(&9), 3);
118 }
119
120 #[test]
121 fn index_test() {
122 let seq = SortedSeq::new(vec![4, 4, 2, 5, 2, 9]);
123 assert_eq!(seq.at(0), &2);
125 assert_eq!(seq.at(1), &4);
126 assert_eq!(seq.at(2), &5);
127 assert_eq!(seq.at(3), &9);
128 }
129
130 #[test]
131 #[should_panic]
132 fn not_found_test() {
133 let seq: SortedSeq<i32> = SortedSeq::new(vec![4, 4, 2, 5, 2, 9]);
134 seq.ord(&6);
135 }
136}