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