/// The representation of data, rows and columns of a [`Grid`].
///
/// [`Grid`]: crate::grid::iterable::Grid
pub trait IntoRecords {
    /// A string representation of a [`Grid`] cell.
    ///
    /// [`Grid`]: crate::grid::iterable::Grid
    type Cell;

    /// Cell iterator inside a row.
    type IterColumns: IntoIterator<Item = Self::Cell>;

    /// Rows iterator.
    type IterRows: IntoIterator<Item = Self::IterColumns>;

    /// Returns an iterator over rows.
    fn iter_rows(self) -> Self::IterRows;
}

impl<T> IntoRecords for T
where
    T: IntoIterator,
    <T as IntoIterator>::Item: IntoIterator,
{
    type Cell = <<T as IntoIterator>::Item as IntoIterator>::Item;
    type IterColumns = <T as IntoIterator>::Item;
    type IterRows = <T as IntoIterator>::IntoIter;

    fn iter_rows(self) -> Self::IterRows {
        self.into_iter()
    }
}
