1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
use super::StrHelper;
impl StrHelper {
/// move element to index, using part's indexes.
///
/// # Example:
/// ```
/// #[macro_use] extern crate std_helper;
/// use std_helper::StrHelper;
///
/// let mut helper = str!("He, lloWorld!");
/// let result = helper.move_to((4, 7), 2).unwrap();
///
/// assert_eq!(result, "Hello, World!");
/// ```
pub fn move_to(&mut self, p_indexes: (usize, usize), new_index: usize) -> Option<String> {
let p_indexes = match p_indexes {
(x, y) if y < x => (y, x),
(x, y) => (x, y)
};
let len = p_indexes.1 - p_indexes.0;
let part1 = self
.split_at(p_indexes.0).1?;
let part2 = part1
.split_str_at(len)
.0?;
let (new_part1, new_part2) = self
.split_string_at(new_index);
let len_part1 = new_part1.clone()?.len();
let new_p_indexes = (
p_indexes.0 - len_part1,
p_indexes.1 - len_part1
);
let new_part2 = StrHelper::new(new_part2?.as_str())
.remove_at(new_p_indexes)?;
self.string = new_part1? + part2;
self.string += new_part2.as_str();
Some(self.string.clone())
}
/// move element to the beginning, using part's indexes.
///
/// # Example:
/// ```
/// #[macro_use] extern crate std_helper;
/// use std_helper::StrHelper;
///
/// let mut helper = str!("World!Hello, ");
/// let result = helper.move_to_the_beginning((6, 13)).unwrap();
///
/// assert_eq!(result, "Hello, World!");
/// ```
pub fn move_to_the_beginning(&mut self, p_indexes: (usize, usize)) -> Option<String> {
let p_indexes = match p_indexes {
(x, y) if y < x => (y, x),
(x, y) => (x, y)
};
let (part1, part2) = self
.split_at(p_indexes.0);
let (part2, part3) = part2?
.split_string_at(p_indexes.1 - p_indexes.0);
self.string = part2? + part1?.string.as_str();
self.string += part3?.as_str();
Some(self.string.clone())
}
/// move element to the end, using part's indexes.
///
/// # Example:
/// ```
/// #[macro_use] extern crate std_helper;
/// use std_helper::StrHelper;
///
/// let mut helper = str!("World!Hello, ");
/// let result = helper.move_to_the_end((0, 6)).unwrap();
///
/// assert_eq!(result, "Hello, World!");
/// ```
pub fn move_to_the_end(&mut self, p_indexes: (usize, usize)) -> Option<String> {
let p_indexes = match p_indexes {
(x, y) if y < x => (y, x),
(x, y) => (x, y)
};
let (part1, part2) = self
.split_at(p_indexes.0);
let (part2, part3) = part2?
.split_string_at(p_indexes.1 - p_indexes.0);
self.string = part1?.string + part3?.as_str();
self.string += part2?.as_str();
Some(self.string.clone())
}
/// switch first and last chars of string.
///
/// # Example:
/// ```
/// #[macro_use] extern crate std_helper;
/// use std_helper::StrHelper;
///
/// let mut helper = str!("!ello, WorldH");
/// let _ = helper.switch_beginning_and_end();
///
/// assert_eq!(helper.as_str(), "Hello, World!")
/// ```
pub fn switch_beginning_and_end(&mut self) -> Option<String> {
let mut old = self.clone();
self.move_to_the_end((0, 1));
old.reverse();
let start_value = old.split_string_on_the_sides_at((0, 1))?;
let len = old.to_string().len() - 1;
self.remove_at((len - 1, len));
self.update((start_value + self.as_str()).as_str());
Some(self.to_string())
}
}