aboutsummaryrefslogtreecommitdiff
path: root/src/math/string.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/math/string.rs')
-rw-r--r--src/math/string.rs61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/math/string.rs b/src/math/string.rs
new file mode 100644
index 0000000..c8d719b
--- /dev/null
+++ b/src/math/string.rs
@@ -0,0 +1,61 @@
+pub trait ContainsAndSkipBrackets {
+ fn contains_and_skip_brackets(&self, pattern: &str) -> bool;
+}
+
+impl ContainsAndSkipBrackets for String {
+ fn contains_and_skip_brackets(&self, pattern: &str) -> bool {
+ if self.contains(pattern) {
+ let (first, _) = self.split_once(pattern).unwrap();
+ let opening_count = first.chars().filter(|c| *c == '(').count();
+ let closing_count = first.chars().filter(|c| *c == ')').count();
+ return opening_count == closing_count;
+ }
+ false
+ }
+}
+
+pub trait SplitMatchingBracket {
+ fn split_on_matching_bracket(&self) -> (&str, &str);
+ fn split_once_and_skipt_brackets(&self, pattern: char) -> Option<(&str, &str)>;
+}
+
+impl SplitMatchingBracket for String {
+ fn split_on_matching_bracket(&self) -> (&str, &str) {
+ let mut i = 0;
+ let mut bracket_balance = -1;
+
+ for c in self.chars() {
+ i += 1;
+ match c {
+ '(' => bracket_balance += 1,
+ ')' => bracket_balance -= 1,
+ _ => {}
+ }
+
+ if bracket_balance < 0 {
+ break;
+ }
+ }
+ self.split_at(i)
+ }
+
+ fn split_once_and_skipt_brackets(&self, pattern: char) -> Option<(&str, &str)> {
+ let mut i = 0;
+ let mut bracket_balance = 0;
+
+ for c in self.chars() {
+ i += 1;
+ match c {
+ '(' => bracket_balance += 1,
+ ')' => bracket_balance -= 1,
+ _ => {}
+ }
+
+ if bracket_balance <= 0 && c == pattern {
+ let (a, b) = self.split_at(i);
+ return Some((&a[0..a.len() - 1], b))
+ }
+ }
+ None
+ }
+}