rarity 0.3.0

Library of useful functions.
Documentation
use std::num::NonZeroUsize;

pub fn get_pages<T>(items: &[T], page_size: NonZeroUsize) -> Vec<&[T]> {
	items.chunks(page_size.get()).collect()
}

pub fn get_page<T>(items: &[T], page_size: NonZeroUsize, page: NonZeroUsize) -> Option<&[T]> {
	let items_start = page_size.get() * page.get();
	let items_end = page_size.get() * (page.get() + 1);

	if items_start >= items.len() {
		return None;
	}

	Some(if items_end > items.len() {
		&items[items_start..]
	} else {
		&items[items_start..items_end]
	})
}

pub fn get_pages_from_string(text: &str, page_size: NonZeroUsize) -> Vec<&str> {
	let page_size = page_size.get();
	let mut passed_newlines = 0;

	let checker = |char: char| {
		if char == '\n' {
			passed_newlines += 1;
			if passed_newlines == page_size {
				passed_newlines = 0;
				return true;
			}
		}
		false
	};

	text.split(checker).collect()
}

pub fn get_page_from_string(
	text: &str, page_size: NonZeroUsize, page: NonZeroUsize,
) -> Option<&str> {
	let pages = get_pages_from_string(text, page_size);
	pages.get(page.get()).copied()
}

#[cfg(test)]
mod tests {
	use super::*;
	#[test]
	fn pages() {
		let list = [1, 2, 3, 4, 5, 6];
		let pages = get_pages(&list, NonZeroUsize::new(2).unwrap());
		assert_eq!(pages, vec![[1, 2], [3, 4], [5, 6]]);
	}
	#[test]
	fn page() {
		let list = [1, 2, 3, 4, 5, 6];
		let pages = get_page(
			&list,
			NonZeroUsize::new(2).unwrap(),
			NonZeroUsize::new(2).unwrap(),
		)
		.unwrap();
		assert_eq!(pages, vec![5, 6]);
	}
}