use std::ops::{Add, AddAssign};

#[derive(Copy, Clone, Debug, Default)]
pub struct ExaQueryResult {
    rows_affected: u64,
}

impl ExaQueryResult {
    pub fn new(rows_affected: u64) -> Self {
        Self { rows_affected }
    }

    pub fn rows_affected(&self) -> u64 {
        self.rows_affected
    }
}

impl Extend<ExaQueryResult> for ExaQueryResult {
    fn extend<T: IntoIterator<Item = ExaQueryResult>>(&mut self, iter: T) {
        for elem in iter {
            self.rows_affected += elem.rows_affected;
        }
    }
}

impl Add for ExaQueryResult {
    type Output = Self;

    fn add(self, rhs: Self) -> Self::Output {
        Self {
            rows_affected: self.rows_affected + rhs.rows_affected,
        }
    }
}

impl AddAssign for ExaQueryResult {
    fn add_assign(&mut self, rhs: Self) {
        self.rows_affected += rhs.rows_affected;
    }
}