Skip to content

Instantly share code, notes, and snippets.

@kdrakon
Created June 5, 2018 06:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kdrakon/83a63a3b402d3ab8cb133598cabe3a71 to your computer and use it in GitHub Desktop.
Save kdrakon/83a63a3b402d3ab8cb133598cabe3a71 to your computer and use it in GitHub Desktop.
A paginated Vec<A>: PagedVec

PagedVec

Takes a Vec<A> and internally creates a Vec<Vec<&A>> which references all the A's from the source vector. With the impl method page_for, you can get a) the "page" for the source vectors index, and b) the modulus translated index for the "page". Needed this for some UI work for printing and paginating a large vector. The real magic comes from the standard libs chunks method.

For example:

let some_vec = vec![1, 2, 3, 4, 5, 6, 7, 8];
let paged = PagedVec::from(some_vec, 3);

let page_1 = paged.page_for(0); // Some(0, vec![1, 2, 3])
let page_1 = paged.page_for(1); // Some(1, vec![1, 2, 3])
let page_1 = paged.page_for(2); // Some(2, vec![1, 2, 3])

let page_2 = paged.page_for(3); // Some(0, vec![4, 5, 6])

let page_3 = paged.page_for(7); // Some(1, vec![7, 8])
pub struct PagedVec<'a, A: 'a> {
indexes: usize,
page_length: usize,
pages: Vec<Vec<&'a A>>,
}
impl<'a, A> PagedVec<'a, A> {
pub fn from(vec: &'a Vec<A>, page_length: usize) -> PagedVec<'a, A> {
PagedVec {
indexes: vec.len(),
page_length,
pages: vec.chunks(page_length).map(|slice| {
slice.iter().collect::<Vec<&'a A>>()
}).collect::<Vec<Vec<&'a A>>>(),
}
}
pub fn page_for(&'a self, index: usize) -> Option<(usize, &'a Vec<&'a A>)> {
self.pages.get((index as f32 / self.page_length as f32).floor() as usize).map(|page| {
(
index % self.page_length,
page
)
})
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment