append/
lib.rs

1use std::collections::VecDeque;
2
3pub trait Append<T> {
4    type Common: From<T>;
5    fn append(&mut self, value: T);
6}
7
8impl<T, S: From<T>> Append<T> for Vec<S> {
9    type Common = S;
10    fn append(&mut self, value: T) {
11        self.push(value.into());
12    }
13}
14
15impl<T, S: From<T>> Append<T> for VecDeque<S> {
16    type Common = S;
17    fn append(&mut self, value: T) {
18        self.push_back(value.into());
19    }
20}
21
22#[test]
23fn foo() {
24    enum Foo {
25        Bar,
26        Baz(u64),
27    }
28
29    impl From<u64> for Foo {
30        fn from(u: u64) -> Self {
31            Foo::Baz(u)
32        }
33    }
34
35    fn f<A: Append<Foo> + Append<u64>>(a: &mut A) {
36        a.append(Foo::Bar);
37        a.append(0);
38    }
39
40    let mut v: Vec<Foo> = Vec::new();
41
42    f(&mut v);
43}