monster 0.1.28

Collection of random utilities
Documentation

pub trait SliceTakeWhile {
    type Item;
    fn take_while<F>(self, f: F) -> Self where
        F: Fn(&Self::Item) -> bool;
}

impl <'a, T> SliceTakeWhile for &'a [T] {
    type Item = T;
    fn take_while<F>(self, f: F) -> Self where
        F: Fn(&Self::Item) -> bool
    {
        slice_take_while(self, f)
    }
}

pub fn slice_take_while<T, F>(slice: &[T], f: F) -> &[T] where
    F: Fn(&T) -> bool
{
    for i in 0 .. slice.len() {
        let elem = unsafe { slice.get_unchecked(i) };
        if !f(elem) {
            return &slice[..i];
        }
    }

    slice
}

#[cfg(test)]
mod test {
    use super::SliceTakeWhile;
    #[test]
    fn slice_take_while_basic() {
        let data = &[1,2,3,4];
        let result = data.take_while(|el| *el <= 2);

        assert_eq!(result, &[1,2]);
    }

    #[test]
    fn slice_take_while_empty() {
        let data = &[1,2,3,4];
        let result = data.take_while(|_| false);

        assert_eq!(result, &[]);
    }

    #[test]
    fn slice_take_while_identity() {
        let data = &[1,2,3,4];
        let result = data.take_while(|_| true);

        assert_eq!(result, data);
    }
}