// Checks for issue #26235

fn main() {
    use std::thread;

    type Key = u32;
    const NUM_THREADS: usize = 2;

    #[derive(Clone, Copy)]
    struct Stats<S> {
        upsert: S,
        delete: S,
        insert: S,
        update: S,
    };

    impl<S> Stats<S>
    where
        S: Copy,
    {
        fn dot<B, F, T>(self, s: Stats<T>, f: F) -> Stats<B>
        where
            F: Fn(S, T) -> B,
        {
            let Stats { upsert: u1, delete: d1, insert: i1, update: p1 } = self;
            let Stats { upsert: u2, delete: d2, insert: i2, update: p2 } = s;
            Stats { upsert: f(u1, u2), delete: f(d1, d2), insert: f(i1, i2), update: f(p1, p2) }
        }

        fn new(init: S) -> Self {
            Stats { upsert: init, delete: init, insert: init, update: init }
        }
    }

    fn make_threads() -> Vec<thread::JoinHandle<()>> {
        let mut t = Vec::with_capacity(NUM_THREADS);
        for _ in 0..NUM_THREADS {
            t.push(thread::spawn(move || {}));
        }
        t
    }

    let stats = [Stats::new(0); NUM_THREADS];
    make_threads();

    {
        let Stats { ref upsert, ref delete, ref insert, ref update } = stats
            .iter()
            .fold(Stats::new(0), |res, &s| res.dot(s, |x: Key, y: Key| x.wrapping_add(y)));
        println!(
            "upserts: {}, deletes: {}, inserts: {}, updates: {}",
            upsert, delete, insert, update
        );
    }
}
