fn main() { slice::run(); string::run(); } mod slice { use std::ops::Range; use splitter::{Info, Splitter}; pub fn run() { #[derive(Default)] struct CustomCtx { cursor: usize, } #[derive(Debug, PartialEq)] struct Custom<'a, T> { content: &'a [T], span: Range, } impl<'a, T> Info<'a, T> for Custom<'a, T> { type Context = CustomCtx; fn generate(ctx: &mut Self::Context, ts: &'a [T]) -> Self { let start = ctx.cursor; ctx.cursor += ts.len(); Custom { content: ts, span: start..ctx.cursor } } } let sp = Splitter::new(b"bytes example", b" ").with_info::>(); assert_eq!( sp.collect::>(), vec![ Custom { content: b"bytes", span: 0..5 }, Custom { content: b" ", span: 5..6 }, Custom { content: b"example", span: 6..13 }, ], ); } } mod string { use std::ops::Range; use splitter::{StrInfo, StrSplitter}; pub fn run() { #[derive(Default)] struct CustomCtx { cursor: usize, } #[derive(Debug, PartialEq)] struct Custom<'a> { content: &'a str, span: Range, } impl<'a> StrInfo<'a> for Custom<'a> { type Context = CustomCtx; fn generate(ctx: &mut Self::Context, s: &'a str) -> Self { let start = ctx.cursor; ctx.cursor += s.len(); Custom { content: s, span: start..ctx.cursor } } } let sp = StrSplitter::new("bytes example", " ").with_info::(); assert_eq!( sp.collect::>(), vec![ Custom { content: "bytes", span: 0..5 }, Custom { content: " ", span: 5..6 }, Custom { content: "example", span: 6..13 }, ], ); } }