enums 0.5.1

Enumerate trait for vector and slice in rust. It abstracts chain methods like .iter().enumerate().collect() into a clean, reusable method also called enums like python enumerate.
Documentation
use std::collections::HashMap;

#[derive(Clone, Copy, Debug)]
pub struct Starter(usize);

impl Starter {
    pub fn new() -> Self {
        Self(0usize)
    }
}

impl Default for Starter {
    fn default() -> Self {
        Starter::new()
    }
}

pub trait Enums {
    type Output;
    fn enums(&self) -> Vec<(usize, Self::Output)>
    where
        Self::Output: Clone;

    fn enums_iter(&self) -> Box<dyn Iterator<Item = (usize, &Self::Output)> + '_>
    where
        Self::Output: std::fmt::Debug;

    fn enums_start_at(&self, at: Starter) -> Vec<(usize, Self::Output)>
    where
        Self::Output: Clone;
    fn enums_mut(&mut self) -> Vec<(usize, &mut Self::Output)>;

    fn to_map(&self) -> HashMap<usize, Self::Output>;
}

impl<T: Clone> Enums for Vec<T> {
    type Output = T;
    fn enums(&self) -> Vec<(usize, Self::Output)> {
        self.iter()
            .enumerate()
            .map(|(i, v)| (i, v.clone()))
            .collect()
    }

    fn enums_iter(&self) -> Box<dyn Iterator<Item = (usize, &Self::Output)> + '_> {
        Box::new(self.iter().enumerate())
    }

    fn enums_start_at(&self, at: Starter) -> Vec<(usize, Self::Output)> {
        self.iter()
            .enumerate()
            .map(|(i, v)| (i + at.0, v.clone()))
            .collect()
    }

    fn enums_mut(&mut self) -> Vec<(usize, &mut Self::Output)> {
        self.iter_mut().enumerate().collect()
    }

    /// check to_map function
    /// ```
    /// use std::collections::HashMap;
    /// use enums::enums::Enums;
    ///
    /// let numbers = vec![23,56,90];
    /// let mut hash = HashMap::new();
    /// hash.insert(0, 23);
    /// hash.insert(1, 56);
    /// hash.insert(2, 90);
    /// assert_eq!(numbers.to_map(), hash);
    /// ```
    fn to_map(&self) -> HashMap<usize, Self::Output> {
        self.iter()
            .enumerate()
            .map(|(i, v)| (i, v.clone()))
            .collect::<HashMap<_, _>>()
    }
}

impl<T: Clone> Enums for [T] {
    type Output = T;
    fn enums(&self) -> Vec<(usize, Self::Output)> {
        self.iter()
            .enumerate()
            .map(|(i, v)| (i, v.clone()))
            .collect()
    }

    fn enums_iter(&self) -> Box<dyn Iterator<Item = (usize, &Self::Output)> + '_> {
        Box::new(self.iter().enumerate())
    }

    fn enums_start_at(&self, at: Starter) -> Vec<(usize, Self::Output)> {
        self.iter()
            .enumerate()
            .map(|(i, v)| (i + at.0, v.clone()))
            .collect()
    }

    fn enums_mut(&mut self) -> Vec<(usize, &mut Self::Output)> {
        self.iter_mut().enumerate().collect()
    }

    /// check to_map function
    /// ```
    /// use std::collections::HashMap;
    /// use enums::enums::Enums;
    ///
    /// let numbers = [23,56,90];
    /// let mut hash = HashMap::new();
    /// hash.insert(0, 23);
    /// hash.insert(1, 56);
    /// hash.insert(2, 90);
    /// assert_eq!(numbers.to_map(), hash);
    /// ```
    fn to_map(&self) -> HashMap<usize, Self::Output> {
        self.iter()
            .enumerate()
            .map(|(i, v)| (i, v.clone()))
            .collect::<HashMap<_, _>>()
    }
}

impl From<Starter> for usize {
    fn from(start: Starter) -> usize {
        start.0
    }
}

impl From<usize> for Starter {
    fn from(start: usize) -> Starter {
        Starter(start)
    }
}

#[cfg(test)]
mod tests;