1use std::ops::{ControlFlow, Try};
5
6pub trait VecExt<T> {
7 fn push_unique(&mut self, value: T) -> Option<T>
8 where
9 T: PartialEq;
10
11 fn try_push<R>(&mut self, value: R)
12 where
13 R: Try<Output = T>;
14}
15
16impl<T> VecExt<T> for Vec<T> {
17 fn push_unique(&mut self, value: T) -> Option<T>
18 where
19 T: PartialEq,
20 {
21 if self.contains(&value) {
22 Some(value)
23 } else {
24 self.push(value);
25 None
26 }
27 }
28
29 fn try_push<R>(&mut self, value: R)
30 where
31 R: Try<Output = T>,
32 {
33 if let ControlFlow::Continue(value) = value.branch() {
34 self.push(value);
35 }
36 }
37}