Skip to content

Instantly share code, notes, and snippets.

@bend-n
Created December 19, 2023 23:29
Show Gist options
  • Save bend-n/697700485104c2b74e1deb2d4f676a8b to your computer and use it in GitHub Desktop.
Save bend-n/697700485104c2b74e1deb2d4f676a8b to your computer and use it in GitHub Desktop.
pub struct Lines<'a> {
bytes: &'a [u8],
}
impl<'a> Iterator for Lines<'a> {
type Item = &'a [u8];
fn next(&mut self) -> Option<Self::Item> {
self.bytes.take_line()
}
}
impl<'a> std::iter::FusedIterator for Lines<'a> {}
pub trait IntoLines {
fn 行(&self) -> Lines<'_>;
}
impl<T: AsRef<[u8]>> IntoLines for T {
fn 行(&self) -> Lines<'_> {
Lines {
bytes: self.as_ref(),
}
}
}
pub trait TakeLine<'b> {
fn take_line<'a>(&'a mut self) -> Option<&'b [u8]>;
}
impl<'b> TakeLine<'b> for &'b [u8] {
fn take_line<'a>(&'a mut self) -> Option<&'b [u8]> {
match memchr::memchr(b'\n', self) {
None if self.is_empty() => None,
None => {
let line = *self;
*self = b"";
Some(line)
}
Some(end) => {
let line = &self[..end];
*self = &self[end + 1..];
Some(line)
}
}
}
}
impl<'b> TakeLine<'b> for &'b str {
fn take_line<'a>(&'a mut self) -> Option<&'b [u8]> {
match memchr::memchr(b'\n', self.as_bytes()) {
None if self.is_empty() => None,
None => {
let line = self.as_bytes();
*self = "";
Some(line)
}
Some(end) => {
let line = self[..end].as_bytes();
*self = &self[end + 1..];
Some(line)
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment