//! "Diff"ing iterators for caching elements to sequential collections without requiring the new
//! elements' iterator to be `Clone`.
//!
//! - [`Diff`] (produced by the [`diff_with`] function)
//! describes the difference between two non-`Clone` iterators `I` and `J` after breaking ASAP from
//! a lock-step comparison.

use std::fmt;

use crate::free::put_back;
use crate::structs::PutBack;

/// A type returned by the [`diff_with`] function.
///
/// `Diff` represents the way in which the elements yielded by the iterator `I` differ to some
/// iterator `J`.
pub enum Diff<I, J>
where
    I: Iterator,
    J: Iterator,
{
    /// The index of the first non-matching element along with both iterator's remaining elements
    /// starting with the first mis-match.
    FirstMismatch(usize, PutBack<I>, PutBack<J>),
    /// The total number of elements that were in `J` along with the remaining elements of `I`.
    Shorter(usize, PutBack<I>),
    /// The total number of elements that were in `I` along with the remaining elements of `J`.
    Longer(usize, PutBack<J>),
}

impl<I, J> fmt::Debug for Diff<I, J>
where
    I: Iterator,
    J: Iterator,
    PutBack<I>: fmt::Debug,
    PutBack<J>: fmt::Debug,
{
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            Self::FirstMismatch(idx, i, j) => f
                .debug_tuple("FirstMismatch")
                .field(idx)
                .field(i)
                .field(j)
                .finish(),
            Self::Shorter(idx, i) => f.debug_tuple("Shorter").field(idx).field(i).finish(),
            Self::Longer(idx, j) => f.debug_tuple("Longer").field(idx).field(j).finish(),
        }
    }
}

impl<I, J> Clone for Diff<I, J>
where
    I: Iterator,
    J: Iterator,
    PutBack<I>: Clone,
    PutBack<J>: Clone,
{
    fn clone(&self) -> Self {
        match self {
            Self::FirstMismatch(idx, i, j) => Self::FirstMismatch(*idx, i.clone(), j.clone()),
            Self::Shorter(idx, i) => Self::Shorter(*idx, i.clone()),
            Self::Longer(idx, j) => Self::Longer(*idx, j.clone()),
        }
    }
}

/// Compares every element yielded by both `i` and `j` with the given function in lock-step and
/// returns a [`Diff`] which describes how `j` differs from `i`.
///
/// If the number of elements yielded by `j` is less than the number of elements yielded by `i`,
/// the number of `j` elements yielded will be returned along with `i`'s remaining elements as
/// `Diff::Shorter`.
///
/// If the two elements of a step differ, the index of those elements along with the remaining
/// elements of both `i` and `j` are returned as `Diff::FirstMismatch`.
///
/// If `i` becomes exhausted before `j` becomes exhausted, the number of elements in `i` along with
/// the remaining `j` elements will be returned as `Diff::Longer`.
pub fn diff_with<I, J, F>(i: I, j: J, is_equal: F) -> Option<Diff<I::IntoIter, J::IntoIter>>
where
    I: IntoIterator,
    J: IntoIterator,
    F: Fn(&I::Item, &J::Item) -> bool,
{
    let mut i = i.into_iter();
    let mut j = j.into_iter();
    let mut idx = 0;
    while let Some(i_elem) = i.next() {
        match j.next() {
            None => return Some(Diff::Shorter(idx, put_back(i).with_value(i_elem))),
            Some(j_elem) => {
                if !is_equal(&i_elem, &j_elem) {
                    let remaining_i = put_back(i).with_value(i_elem);
                    let remaining_j = put_back(j).with_value(j_elem);
                    return Some(Diff::FirstMismatch(idx, remaining_i, remaining_j));
                }
            }
        }
        idx += 1;
    }
    j.next()
        .map(|j_elem| Diff::Longer(idx, put_back(j).with_value(j_elem)))
}
