diff options
Diffstat (limited to 'helix-stdx')
-rw-r--r-- | helix-stdx/Cargo.toml | 1 | ||||
-rw-r--r-- | helix-stdx/src/lib.rs | 1 | ||||
-rw-r--r-- | helix-stdx/src/rope.rs | 26 |
3 files changed, 28 insertions, 0 deletions
diff --git a/helix-stdx/Cargo.toml b/helix-stdx/Cargo.toml index 216a3b40..9b4de9fe 100644 --- a/helix-stdx/Cargo.toml +++ b/helix-stdx/Cargo.toml @@ -14,6 +14,7 @@ homepage.workspace = true [dependencies] dunce = "1.0" etcetera = "0.8" +ropey = { version = "1.6.1", default-features = false } [dev-dependencies] tempfile = "3.9" diff --git a/helix-stdx/src/lib.rs b/helix-stdx/src/lib.rs index ae3c3a98..68fe3ec3 100644 --- a/helix-stdx/src/lib.rs +++ b/helix-stdx/src/lib.rs @@ -1,2 +1,3 @@ pub mod env; pub mod path; +pub mod rope; diff --git a/helix-stdx/src/rope.rs b/helix-stdx/src/rope.rs new file mode 100644 index 00000000..4ee39d4a --- /dev/null +++ b/helix-stdx/src/rope.rs @@ -0,0 +1,26 @@ +use ropey::RopeSlice; + +pub trait RopeSliceExt: Sized { + fn ends_with(self, text: &str) -> bool; + fn starts_with(self, text: &str) -> bool; +} + +impl RopeSliceExt for RopeSlice<'_> { + fn ends_with(self, text: &str) -> bool { + let len = self.len_bytes(); + if len < text.len() { + return false; + } + self.get_byte_slice(len - text.len()..) + .map_or(false, |end| end == text) + } + + fn starts_with(self, text: &str) -> bool { + let len = self.len_bytes(); + if len < text.len() { + return false; + } + self.get_byte_slice(..len - text.len()) + .map_or(false, |start| start == text) + } +} |