feat: span works from the offset
This commit is contained in:
parent
562a78eb3f
commit
025535f03c
2
Cargo.lock
generated
2
Cargo.lock
generated
@ -3,5 +3,5 @@
|
|||||||
version = 3
|
version = 3
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "slice-cursor"
|
name = "slice-utils"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "slice-cursor"
|
name = "slice-utils"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
|
36
src/lib.rs
36
src/lib.rs
@ -42,6 +42,16 @@ pub trait Positioned: Offsetable {
|
|||||||
fn column(&self) -> usize;
|
fn column(&self) -> usize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// An input that can provide a span of a range of the input starting from the offset
|
||||||
|
pub trait Span<O> {
|
||||||
|
fn span<R: Into<SpanRange>>(&self, idx: R) -> O;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The interface for types that can peek ahead to the next item.
|
||||||
|
pub trait Peekable<O> {
|
||||||
|
fn peek_next(&self) -> Option<O>;
|
||||||
|
}
|
||||||
|
|
||||||
/// SpanRange encompasses the valid Ops::Range types for use with the Span trait.
|
/// SpanRange encompasses the valid Ops::Range types for use with the Span trait.
|
||||||
pub enum SpanRange {
|
pub enum SpanRange {
|
||||||
Range(std::ops::Range<usize>),
|
Range(std::ops::Range<usize>),
|
||||||
@ -74,16 +84,6 @@ impl From<std::ops::RangeFull> for SpanRange {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// An input that can provide a span of a range of the input.
|
|
||||||
pub trait Span<O> {
|
|
||||||
fn span<R: Into<SpanRange>>(&self, idx: R) -> O;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// The interface for types that can peek ahead to the next item.
|
|
||||||
pub trait Peekable<O> {
|
|
||||||
fn peek_next(&self) -> Option<O>;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// A Cloneable Iterator that can report an offset as a count of processed Items.
|
/// A Cloneable Iterator that can report an offset as a count of processed Items.
|
||||||
pub trait Cursor: Iterator + Clone + Offsetable {
|
pub trait Cursor: Iterator + Clone + Offsetable {
|
||||||
fn curr(&self) -> Self::Item;
|
fn curr(&self) -> Self::Item;
|
||||||
@ -171,10 +171,10 @@ impl<'a, T: Debug + 'a> Cursor for SliceCursor<'a, T> {
|
|||||||
impl<'a, T: Debug + 'a> Span<&'a [T]> for SliceCursor<'a, T> {
|
impl<'a, T: Debug + 'a> Span<&'a [T]> for SliceCursor<'a, T> {
|
||||||
fn span<R: Into<SpanRange>>(&self, idx: R) -> &'a [T] {
|
fn span<R: Into<SpanRange>>(&self, idx: R) -> &'a [T] {
|
||||||
match idx.into() {
|
match idx.into() {
|
||||||
SpanRange::Range(r) => self.source.index(r),
|
SpanRange::Range(r) => self.source[self.offset..].index(r),
|
||||||
SpanRange::RangeTo(r) => self.source.index(r),
|
SpanRange::RangeTo(r) => self.source[self.offset..].index(r),
|
||||||
SpanRange::RangeFrom(r) => self.source.index(r),
|
SpanRange::RangeFrom(r) => self.source[self.offset..].index(r),
|
||||||
SpanRange::RangeFull(r) => self.source.index(r),
|
SpanRange::RangeFull(r) => self.source[self.offset..].index(r),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -295,10 +295,10 @@ impl<'a> From<&'a str> for StrCursor<'a> {
|
|||||||
impl<'a> Span<&'a str> for StrCursor<'a> {
|
impl<'a> Span<&'a str> for StrCursor<'a> {
|
||||||
fn span<R: Into<SpanRange>>(&self, idx: R) -> &'a str {
|
fn span<R: Into<SpanRange>>(&self, idx: R) -> &'a str {
|
||||||
match idx.into() {
|
match idx.into() {
|
||||||
SpanRange::Range(r) => self.source.index(r),
|
SpanRange::Range(r) => self.source[self.offset..].index(r),
|
||||||
SpanRange::RangeTo(r) => self.source.index(r),
|
SpanRange::RangeTo(r) => self.source[self.offset..].index(r),
|
||||||
SpanRange::RangeFrom(r) => self.source.index(r),
|
SpanRange::RangeFrom(r) => self.source[self.offset..].index(r),
|
||||||
SpanRange::RangeFull(r) => self.source.index(r),
|
SpanRange::RangeFull(r) => self.source[self.offset..].index(r),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
24
src/test.rs
24
src/test.rs
@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
SliceCursor, StrCursor,
|
SliceCursor, StrCursor,
|
||||||
Cursor, Offsetable,
|
Cursor, Offsetable, Span
|
||||||
};
|
};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -80,3 +80,25 @@ fn test_str_iter() {
|
|||||||
assert_eq!('o' as u8, out[1]);
|
assert_eq!('o' as u8, out[1]);
|
||||||
assert_eq!('o' as u8, out[2]);
|
assert_eq!('o' as u8, out[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_str_span() {
|
||||||
|
let input_str = "foo bar quux";
|
||||||
|
|
||||||
|
let mut iter = StrCursor::new(input_str);
|
||||||
|
assert_eq!(0, iter.get_offset());
|
||||||
|
assert_eq!("foo", iter.span(0..3));
|
||||||
|
iter.next();
|
||||||
|
assert_eq!("oo", iter.span(0..2));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_slice_span() {
|
||||||
|
let input_str = "foo bar quux";
|
||||||
|
|
||||||
|
let mut iter = SliceCursor::new(input_str.as_bytes());
|
||||||
|
assert_eq!(0, iter.get_offset());
|
||||||
|
assert_eq!("foo".as_bytes(), iter.span(0..3));
|
||||||
|
iter.next();
|
||||||
|
assert_eq!("oo".as_bytes(), iter.span(0..2));
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user