grafix_toolbox/kit/policies/func/
slicing.rs1pub 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
47impl<'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}