Skip to main content

grafix_toolbox/kit/policies/func/
slicing.rs

1pub fn split(s: &str, f: impl Fn(char) -> bool) -> (&str, &str) {
2	let at = find(s, f);
3	(&s[..at], &s[at..])
4}
5
6pub fn slice<'a>(args: impl SliceArgs<'a>) -> &'a str {
7	let (beg, s, end) = args.get();
8	&s[beg.min(s.len())..end.min(s.len())]
9}
10
11type Args<'a> = (usize, &'a str, usize);
12pub trait SliceArgs<'a> {
13	fn get(self) -> Args<'a>; // TODO replace with Pattern
14}
15impl<'a> SliceArgs<'a> for Args<'a> {
16	fn get(self) -> Self {
17		self
18	}
19}
20
21impl<'a, F: Fn(char) -> bool> SliceArgs<'a> for (F, &'a str) {
22	fn get(self) -> Args<'a> {
23		let (f, s) = self;
24		let at = find(s, f);
25		(at, s, s.len())
26	}
27}
28impl<'a, F: Fn(char) -> bool> SliceArgs<'a> for (&'a str, F) {
29	fn get(self) -> Args<'a> {
30		let (s, f) = self;
31		let at = find(s, f);
32		(0, s, at)
33	}
34}
35impl<'a, F: Fn(char) -> bool> SliceArgs<'a> for (F, &'a str, F) {
36	fn get(self) -> Args<'a> {
37		let (f1, s, f2) = self;
38		let beg = find(s, f1);
39		let end = find(s, f2);
40		(beg, s, end)
41	}
42}
43
44impl<'a, F: Fn(char) -> bool> SliceArgs<'a> for (F, &'a String) {
45	fn get(self) -> Args<'a> {
46		(self.0, self.1 as &'a str).get()
47	}
48}
49impl<'a, F: Fn(char) -> bool> SliceArgs<'a> for (&'a String, F) {
50	fn get(self) -> Args<'a> {
51		(self.0 as &'a str, self.1).get()
52	}
53}
54impl<'a, F: Fn(char) -> bool> SliceArgs<'a> for (F, &'a String, F) {
55	fn get(self) -> Args<'a> {
56		(self.0, self.1 as &'a str, self.2).get()
57	}
58}
59
60fn find(s: &str, f: impl Fn(char) -> bool) -> usize {
61	s.find(f).unwrap_or(s.len())
62}