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>; }
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}