enneagram 1.3.0

A digital enneagram
pub fn lines<E>(path: impl IntoIterator<Item = E>) -> impl Iterator<Item = [E; 2]>
where
    E: Copy
{
    let path = path.into_iter()
        .collect::<Vec<_>>();
    path.last()
        .copied()
        .map(|mut prev| path.into_iter()
            .map(move |edge| [core::mem::replace(&mut prev, edge), edge])
        ).into_iter()
        .flatten()
}

pub fn lines_disconnected<E>(path: impl IntoIterator<Item = E>) -> impl Iterator<Item = [E; 2]>
where
    E: Copy
{
    let mut path = path.into_iter();
    path.next()
        .map(|mut prev| path.map(move |edge| [core::mem::replace(&mut prev, edge), edge]))
        .into_iter()
        .flatten()
}