Skip to main content

nil_util/
vec.rs

1// Copyright (C) Call of Nil contributors
2// SPDX-License-Identifier: AGPL-3.0-only
3
4use 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}