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>;
14}
15impl<'a> SliceArgs<'a> for Args<'a> {
16	fn get(self) -> Self {
17		self
18	}
19}
20impl<'a> SliceArgs<'a> for (usize, &'a str) {
21	fn get(self) -> Args<'a> {
22		(self.0, self.1, self.1.len())
23	}
24}
25impl<'a> SliceArgs<'a> for (&'a str, usize) {
26	fn get(self) -> Args<'a> {
27		(0, self.0, self.1)
28	}
29}
30
31impl<'a> SliceArgs<'a> for (usize, &'a String, usize) {
32	fn get(self) -> Args<'a> {
33		(self.0, self.1, self.2)
34	}
35}
36impl<'a> SliceArgs<'a> for (usize, &'a String) {
37	fn get(self) -> Args<'a> {
38		(self.0, self.1 as &'a str).get()
39	}
40}
41impl<'a> SliceArgs<'a> for (&'a String, usize) {
42	fn get(self) -> Args<'a> {
43		(self.0 as &'a str, self.1).get()
44	}
45}
46
47/// TODO replace with Pattern
48impl<'a, F: Fn(char) -> bool> SliceArgs<'a> for (F, &'a str) {
49	fn get(self) -> Args<'a> {
50		let (f, s) = self;
51		let at = find(s, f);
52		(at, s, s.len())
53	}
54}
55impl<'a, F: Fn(char) -> bool> SliceArgs<'a> for (&'a str, F) {
56	fn get(self) -> Args<'a> {
57		let (s, f) = self;
58		let at = find(s, f);
59		(0, s, at)
60	}
61}
62impl<'a, F: Fn(char) -> bool> SliceArgs<'a> for (F, &'a str, F) {
63	fn get(self) -> Args<'a> {
64		let (f1, s, f2) = self;
65		let beg = find(s, f1);
66		let end = find(s, f2);
67		(beg, s, end)
68	}
69}
70
71impl<'a, F: Fn(char) -> bool> SliceArgs<'a> for (F, &'a String) {
72	fn get(self) -> Args<'a> {
73		(self.0, self.1 as &'a str).get()
74	}
75}
76impl<'a, F: Fn(char) -> bool> SliceArgs<'a> for (&'a String, F) {
77	fn get(self) -> Args<'a> {
78		(self.0 as &'a str, self.1).get()
79	}
80}
81impl<'a, F: Fn(char) -> bool> SliceArgs<'a> for (F, &'a String, F) {
82	fn get(self) -> Args<'a> {
83		(self.0, self.1 as &'a str, self.2).get()
84	}
85}
86
87fn find(s: &str, f: impl Fn(char) -> bool) -> usize {
88	s.find(f).unwrap_or(s.len())
89}