Struct janetrs::JanetBuffer[][src]

#[repr(transparent)]
pub struct JanetBuffer<'data> { /* fields omitted */ }
Expand description

Janet buffers are the mutable version of JanetStrings. Since Janet strings can hold any sequence of bytes, including zeros, buffers share this same property and can be used to hold any arbitrary memory, which makes them very simple but versatile data structures. They can be used to accumulate small strings into a large string, to implement a bitset, or to represent sound or images in a program.

Examples

You can create a JanetBuffer from a Rust string literal.

use janetrs::JanetBuffer;

let hello = JanetBuffer::from("Hello, world!");

You can append a char to a JanetBuffer with the push method, and append a str with the push_str method:

use janetrs::JanetBuffer;

let mut buff = JanetBuffer::from("Hello, ");
buff.push('w');
buff.push_str("orld!");

You can also append a arbitrary sized unsigned integers with push_u8, push_u16, push_u32, push_u64:

use janetrs::JanetBuffer;

let mut buff = JanetBuffer::with_capacity(20);

buff.push_u8(10);
buff.push_u16(60000);
buff.push_u32(u32::MAX);
buff.push_u64(u64::MIN);

Implementations

Creates a empty JanetBuffer.

It is initially created with capacity 4, so it will not allocate until it is first pushed into.

Examples

use janetrs::JanetBuffer;

let buff = JanetBuffer::new();

Create a empty JanetBuffer given to Janet the specified capacity.

When capacity is lesser than four, it’s the same as calling with capacity equals to four.

Examples

use janetrs::JanetBuffer;

let buff = JanetBuffer::with_capacity(10);

Create a new JanetBuffer with a raw pointer.

Safety

This function do not check if the given raw is NULL or not. Use at your own risk.

Returns the number of elements the buffer can hold without reallocating.

Returns the number of elements in the buffer, also referred to as its ‘length’.

Examples

use janetrs::JanetBuffer;

let mut buff = JanetBuffer::new();
assert_eq!(buff.len(), 0);
buff.push('c');
assert_eq!(buff.len(), 1);

Returns true if the buffer contains no elements.

Examples

use janetrs::JanetBuffer;

let mut buff = JanetBuffer::new();
assert!(buff.is_empty());
buff.push('1');
assert!(!buff.is_empty());

Set the length of the buffer to new_len.

If new_len is greater than the current buffer length, this append null character (‘\0’) values into the buffer, and if new_len is lesser than the current buffer length, the Janet garbage collector will handle the bytes not used anymore, that’s the reason this function is safe to call compared to the Rust String method with the same name.

This functions does nothing if new_len is lesser than zero.

Note that this method has no effect on the allocated capacity of the buffer.

Ensure that a buffer has enough space for check_capacity elements. If not, resize the backing memory to capacity * growth slots. In most cases, growth should be 1 or 2.

Ensures that this JanetBuffer’s capacity is at least additional bytes larger than its length.

The capacity may be increased by more than additional bytes if it chooses, to prevent frequent reallocations.

If you do not want this “at least” behavior, see the reserve_exact method.

Panics

Panics if the new capacity overflows i32.

Ensures that this JanetBuffer’s capacity is additional bytes larger than its length.

Consider using the reserve method unless you absolutely know better than the allocator.

Panics

Panics if the new capacity overflows usize.

Truncates this JanetBuffer, removing all contents.

While this means the string will have a length of zero, it does not touch its capacity.

Append the given char onto the end of the buffer.

Append the given byte slice onto the end of the buffer.

If the bytes have a length bigger than i32::MAX, it will push only the first i32::MAX values.

Appends the given char to the end of this buffer.

Examples

Basic usage:

use janetrs::JanetBuffer;

let mut s = JanetBuffer::from("abc");
s.push_char('1');
s.push_char('2');
s.push_char('3');
assert_eq!(s.as_bytes(), "abc123".as_bytes());

Append the given string slice onto the end of the buffer.

Append the given u8 onto the end of the buffer.

Append the given u16 onto the end of the buffer.

Append the given u32 onto the end of the buffer.

Append the given u64 onto the end of the buffer.

Append the given c-string slice onto the end of the buffer.

Returns a byte slice of the JanetBuffer contents.

Examples

use janetrs::JanetBuffer;

let buff = JanetBuffer::from("hello");

assert_eq!(&[104, 101, 108, 108, 111], buff.as_bytes());

Returns a mutable byte slice of the JanetBuffer contents.

Examples

use janetrs::JanetBuffer;

let mut buff = JanetBuffer::from("hello");

assert_eq!(&mut [104, 101, 108, 108, 111], buff.as_bytes_mut());

Returns true if and only if this buffer contains the given needle.

Examples

use janetrs::JanetBuffer;

let buff = JanetBuffer::from("Hey there");

assert!(buff.contains("the"))

Returns true if and only if this buffer has the given prefix.

Examples

use janetrs::JanetBuffer;

assert!(JanetBuffer::from("foo bar").starts_with("foo"));
assert!(!JanetBuffer::from("foo bar").starts_with("bar"));
assert!(!JanetBuffer::from("foo bar").starts_with("foobar"));

Returns true if and only if this buffer has the given suffix.

Examples

use janetrs::JanetBuffer;

assert!(!JanetBuffer::from("foo bar").ends_with("foo"));
assert!(JanetBuffer::from("foo bar").ends_with("bar"));
assert!(!JanetBuffer::from("foo bar").ends_with("foobar"));

Returns true if and only if every byte in this buffer is ASCII.

ASCII is an encoding that defines 128 codepoints. A byte corresponds to an ASCII codepoint if and only if it is in the inclusive range [0, 127].

Examples

use janetrs::JanetBuffer;

assert!(JanetBuffer::from("abc").is_ascii());
assert!(!JanetBuffer::from("☃βツ").is_ascii());

Returns true if and only if the entire buffer is valid UTF-8.

If you need location information about where a buffer’s first invalid UTF-8 byte is, then use the to_str method.

Examples

use janetrs::JanetBuffer;

assert!(JanetBuffer::from("abc").is_utf8());
assert!(JanetBuffer::from("☃βツ").is_utf8());
// invalid bytes
assert!(!JanetBuffer::from(&b"abc\xFF"[..]).is_utf8());
// surrogate encoding
assert!(!JanetBuffer::from(&b"\xED\xA0\x80"[..]).is_utf8());
// incomplete sequence
assert!(!JanetBuffer::from(&b"\xF0\x9D\x9Ca"[..]).is_utf8());
// overlong sequence
assert!(!JanetBuffer::from(&b"\xF0\x82\x82\xAC"[..]).is_utf8());

Returns a new JanetBuffer containing the lowercase equivalent of this buffer.

In this case, lowercase is defined according to the Lowercase Unicode property.

If invalid UTF-8 is seen, or if a character has no lowercase variant, then it is written to the given buffer unchanged.

Note that some characters in this buffer may expand into multiple characters when changing the case, so the number of bytes written to the given buffer may not be equivalent to the number of bytes in this buffer.

If you’d like to reuse an allocation for performance reasons, then use to_lowercase_into instead.

Examples

Basic usage:

use janetrs::JanetBuffer;

let s = JanetBuffer::from("HELLO Β");
assert_eq!("hello β".as_bytes(), s.to_lowercase().as_bytes());

Scripts without case are not changed:

use janetrs::JanetBuffer;

let s = JanetBuffer::from("农历新年");
assert_eq!("农历新年".as_bytes(), s.to_lowercase().as_bytes());

Invalid UTF-8 remains as is:

use janetrs::JanetBuffer;

let s = JanetBuffer::from(&b"FOO\xFFBAR\xE2\x98BAZ"[..]);
assert_eq!(&b"foo\xFFbar\xE2\x98baz"[..], s.to_lowercase().as_bytes());

Writes the lowercase equivalent of this buffer into the given buffer. The buffer is not cleared before written to.

In this case, lowercase is defined according to the Lowercase Unicode property.

If invalid UTF-8 is seen, or if a character has no lowercase variant, then it is written to the given buffer unchanged.

Note that some characters in this buffer may expand into multiple characters when changing the case, so the number of bytes written to the given buffer may not be equivalent to the number of bytes in this buffer.

If you don’t need to amortize allocation and instead prefer convenience, then use to_lowercase instead.

Examples

Basic usage:

use janetrs::JanetBuffer;

let s = JanetBuffer::from("HELLO Β");

let mut buf = JanetBuffer::new();
s.to_lowercase_into(&mut buf);
assert_eq!("hello β".as_bytes(), buf.as_bytes());

Scripts without case are not changed:

use janetrs::JanetBuffer;

let s = JanetBuffer::from("农历新年");

let mut buf = JanetBuffer::new();
s.to_lowercase_into(&mut buf);
assert_eq!("农历新年".as_bytes(), buf.as_bytes());

Invalid UTF-8 remains as is:

use janetrs::JanetBuffer;

let s = JanetBuffer::from(&b"FOO\xFFBAR\xE2\x98BAZ"[..]);

let mut buf = JanetBuffer::new();
s.to_lowercase_into(&mut buf);
assert_eq!(&b"foo\xFFbar\xE2\x98baz"[..], buf.as_bytes());

Returns a new JanetBuffer containing the ASCII lowercase equivalent of this buffer.

In this case, lowercase is only defined in ASCII letters. Namely, the letters A-Z are converted to a-z. All other bytes remain unchanged. In particular, the length of the buffer returned is always equivalent to the length of this buffer.

If you’d like to reuse an allocation for performance reasons, then use make_ascii_lowercase to perform the conversion in place.

Examples

Basic usage:

use janetrs::JanetBuffer;

let s = JanetBuffer::from("HELLO Β");
assert_eq!("hello Β".as_bytes(), s.to_ascii_lowercase().as_bytes());

Invalid UTF-8 remains as is:

use janetrs::JanetBuffer;

let s = JanetBuffer::from(&b"FOO\xFFBAR\xE2\x98BAZ"[..]);
assert_eq!(
    s.to_ascii_lowercase().as_bytes(),
    &b"foo\xFFbar\xE2\x98baz"[..]
);

Convert this buffer to its lowercase ASCII equivalent in place.

In this case, lowercase is only defined in ASCII letters. Namely, the letters A-Z are converted to a-z. All other bytes remain unchanged.

If you don’t need to do the conversion in place and instead prefer convenience, then use to_ascii_lowercase instead.

Examples

Basic usage:

use janetrs::JanetBuffer;

let mut s = JanetBuffer::from("HELLO Β");
s.make_ascii_lowercase();
assert_eq!(s.as_bytes(), "hello Β".as_bytes());

Invalid UTF-8 remains as is:

use janetrs::JanetBuffer;

let mut s = JanetBuffer::from(&b"FOO\xFFBAR\xE2\x98BAZ"[..]);
s.make_ascii_lowercase();
assert_eq!(s.as_bytes(), &b"foo\xFFbar\xE2\x98baz"[..]);

Returns a new JanetBuffer containing the uppercase equivalent of this buffer.

In this case, uppercase is defined according to the Uppercase Unicode property.

If invalid UTF-8 is seen, or if a character has no uppercase variant, then it is written to the given buffer unchanged.

Note that some characters in this buffer may expand into multiple characters when changing the case, so the number of bytes written to the given buffer may not be equivalent to the number of bytes in this buffer.

If you’d like to reuse an allocation for performance reasons, then use to_uppercase_into instead.

Examples

Basic usage:

use janetrs::JanetBuffer;

let s = JanetBuffer::from("hello β");
assert_eq!(s.to_uppercase().as_bytes(), "HELLO Β".as_bytes());

Scripts without case are not changed:

use janetrs::JanetBuffer;

let s = JanetBuffer::from("农历新年");
assert_eq!(s.to_uppercase().as_bytes(), "农历新年".as_bytes());

Invalid UTF-8 remains as is:

use janetrs::JanetBuffer;

let s = JanetBuffer::from(&b"foo\xFFbar\xE2\x98baz"[..]);
assert_eq!(
    s.to_uppercase().as_bytes(),
    JanetBuffer::from(&b"FOO\xFFBAR\xE2\x98BAZ"[..]).as_bytes()
);

Writes the uppercase equivalent of this buffer into the given buffer. The buffer is not cleared before written to.

In this case, uppercase is defined according to the Uppercase Unicode property.

If invalid UTF-8 is seen, or if a character has no uppercase variant, then it is written to the given buffer unchanged.

Note that some characters in this buffer may expand into multiple characters when changing the case, so the number of bytes written to the given buffer may not be equivalent to the number of bytes in this buffer.

If you don’t need to amortize allocation and instead prefer convenience, then use to_uppercase instead.

Examples

Basic usage:

use janetrs::JanetBuffer;

let s = JanetBuffer::from("hello β");

let mut buf = JanetBuffer::new();
s.to_uppercase_into(&mut buf);
assert_eq!(buf.as_bytes(), "HELLO Β".as_bytes());

Scripts without case are not changed:

use janetrs::JanetBuffer;

let s = JanetBuffer::from("农历新年");

let mut buf = JanetBuffer::new();
s.to_uppercase_into(&mut buf);
assert_eq!(buf.as_bytes(), "农历新年".as_bytes());

Invalid UTF-8 remains as is:

use janetrs::JanetBuffer;

let s = JanetBuffer::from(&b"foo\xFFbar\xE2\x98baz"[..]);

let mut buf = JanetBuffer::new();
s.to_uppercase_into(&mut buf);
assert_eq!(buf.as_bytes(), &b"FOO\xFFBAR\xE2\x98BAZ"[..]);

Returns a new JanetBuffer containing the ASCII uppercase equivalent of this buffer.

In this case, uppercase is only defined in ASCII letters. Namely, the letters a-z are converted to A-Z. All other bytes remain unchanged. In particular, the length of the buffer returned is always equivalent to the length of this buffer.

If you’d like to reuse an allocation for performance reasons, then use make_ascii_uppercase to perform the conversion in place.

Examples

Basic usage:

use janetrs::JanetBuffer;

let s = JanetBuffer::from("hello β");
assert_eq!(s.to_ascii_uppercase().as_bytes(), "HELLO β".as_bytes());

Invalid UTF-8 remains as is:

use janetrs::JanetBuffer;

let s = JanetBuffer::from(&b"foo\xFFbar\xE2\x98baz"[..]);
assert_eq!(
    s.to_ascii_uppercase().as_bytes(),
    &b"FOO\xFFBAR\xE2\x98BAZ"[..]
);

Convert this buffer to its uppercase ASCII equivalent in place.

In this case, uppercase is only defined in ASCII letters. Namely, the letters a-z are converted to A-Z. All other bytes remain unchanged.

If you don’t need to do the conversion in place and instead prefer convenience, then use to_ascii_uppercase instead.

Examples

Basic usage:

use janetrs::JanetBuffer;

let mut s = JanetBuffer::from("hello β");
s.make_ascii_uppercase();
assert_eq!(s.as_bytes(), "HELLO β".as_bytes());

Invalid UTF-8 remains as is:

use janetrs::JanetBuffer;

let mut s = JanetBuffer::from(&b"foo\xFFbar\xE2\x98baz"[..]);
s.make_ascii_uppercase();
assert_eq!(s.as_bytes(), &b"FOO\xFFBAR\xE2\x98BAZ"[..]);

Return a buffer with leading and trailing whitespace removed.

Whitespace is defined according to the terms of the White_Space Unicode property.

Examples

Basic usage:

use janetrs::JanetBuffer;

let s = JanetBuffer::from(" foo\tbar\t\u{2003}\n");
assert_eq!(
    s.trim().as_bytes(),
    JanetBuffer::from("foo\tbar").as_bytes()
);

Return a buffer with leading whitespace removed.

Whitespace is defined according to the terms of the White_Space Unicode property.

Examples

Basic usage:

use janetrs::JanetBuffer;

let s = JanetBuffer::from(" foo\tbar\t\u{2003}\n");
assert_eq!(
    s.trim_start().as_bytes(),
    JanetBuffer::from("foo\tbar\t\u{2003}\n").as_bytes()
);

Return a buffer with trailing whitespace removed.

Whitespace is defined according to the terms of the White_Space Unicode property.

Examples

Basic usage:

use janetrs::JanetBuffer;

let s = JanetBuffer::from(" foo\tbar\t\u{2003}\n");
assert_eq!(
    s.trim_end().as_bytes(),
    JanetBuffer::from(" foo\tbar").as_bytes()
);

Return a buffer with leading and trailing characters satisfying the given predicate removed.

Examples

Basic usage:

use janetrs::JanetBuffer;

let s = JanetBuffer::from("123foo5bar789");
assert_eq!(
    s.trim_with(|c| c.is_numeric()).as_bytes(),
    JanetBuffer::from("foo5bar").as_bytes(),
);

Return a buffer with leading characters satisfying the given predicate removed.

Examples

Basic usage:

use janetrs::JanetBuffer;

let s = JanetBuffer::from("123foo5bar789");
assert_eq!(
    s.trim_start_with(|c| c.is_numeric()).as_bytes(),
    JanetBuffer::from("foo5bar789").as_bytes()
);

Return a buffer with trailing characters satisfying the given predicate removed.

Examples

Basic usage:

use janetrs::JanetBuffer;

let s = JanetBuffer::from("123foo5bar");
assert_eq!(
    s.trim_end_with(|c| c.is_numeric()).as_bytes(),
    JanetBuffer::from("123foo5bar").as_bytes()
);

Safely convert this buffer into a &str if it’s valid UTF-8.

If this buffer is not valid UTF-8, then an error is returned. The error returned indicates the first invalid byte found and the length of the error.

In cases where a lossy conversion to &str is acceptable, then use one of the to_str_lossy or to_str_lossy_into methods.

Unsafely convert this buffer into a &str, without checking for valid UTF-8.

Safety

Callers must ensure that this buffer is valid UTF-8 before calling this method. Converting a buffer into a &str that is not valid UTF-8 is considered undefined behavior.

This routine is useful in performance sensitive contexts where the UTF-8 validity of the buffer is already known and it is undesirable to pay the cost of an additional UTF-8 validation check that to_str performs.

Convert this buffer to a valid UTF-8 string by replacing invalid UTF-8 bytes with the Unicode replacement codepoint (U+FFFD).

If the buffer is already valid UTF-8, then no copying or allocation is performed and a borrowed string slice is returned. If the buffer is not valid UTF-8, then an owned string buffer is returned with invalid bytes replaced by the replacement codepoint.

This method uses the “substitution of maximal subparts” (Unicode Standard, Chapter 3, Section 9) strategy for inserting the replacement codepoint. Specifically, a replacement codepoint is inserted whenever a byte is found that cannot possibly lead to a valid code unit sequence. If there were previous bytes that represented a prefix of a well-formed code unit sequence, then all of those bytes are substituted with a single replacement codepoint. The “substitution of maximal subparts” strategy is the same strategy used by W3C’s Encoding standard. For a more precise description of the maximal subpart strategy, see the Unicode Standard, Chapter 3, Section 9. See also Public Review Issue #121.

N.B. Rust’s standard library also appears to use the same strategy, but it does not appear to be an API guarantee.

Copy the contents of this buffer into the given owned string buffer, while replacing invalid UTF-8 code unit sequences with the Unicode replacement codepoint (U+FFFD).

This method uses the same “substitution of maximal subparts” strategy for inserting the replacement codepoint as the to_str_lossy method.

This routine is useful for amortizing allocation. However, unlike to_str_lossy, this routine will always copy the contents of this buffer into the destination buffer, even if this buffer is valid UTF-8.

Create an OS string slice from this buffer.

On Unix, this always succeeds and is zero cost. On non-Unix systems, this returns a UTF-8 decoding error if this buffer is not valid UTF-8. (For example, on Windows, file paths are allowed to be a sequence of arbitrary 16-bit integers. There is no obvious mapping from an arbitrary sequence of 8-bit integers to an arbitrary sequence of 16-bit integers.)

Lossily create an OS string slice from this buffer.

On Unix, this always succeeds and is zero cost. On non-Unix systems, this will perform a UTF-8 check and lossily convert this buffer into valid UTF-8 using the Unicode replacement codepoint.

Note that this can prevent the correct roundtripping of file paths on non-Unix systems such as Windows, where file paths are an arbitrary sequence of 16-bit integers.

Create a path slice from this buffer.

On Unix, this always succeeds and is zero cost. On non-Unix systems, this returns a UTF-8 decoding error if this buffer is not valid UTF-8. (For example, on Windows, file paths are allowed to be a sequence of arbitrary 16-bit integers. There is no obvious mapping from an arbitrary sequence of 8-bit integers to an arbitrary sequence of 16-bit integers.)

Lossily create a path slice from this buffer.

On Unix, this always succeeds and is zero cost. On non-Unix systems, this will perform a UTF-8 check and lossily convert this buffer into valid UTF-8 using the Unicode replacement codepoint.

Note that this can prevent the correct roundtripping of file paths on non-Unix systems such as Windows, where file paths are an arbitrary sequence of 16-bit integers.

Returns the index of the first occurrence of the given needle.

The needle may be any type that can be cheaply converted into a &[u8]. This includes, but is not limited to, &str and &[u8].

Complexity

This routine is guaranteed to have worst case linear time complexity with respect to both the needle and the haystack. That is, this runs in O(needle.len() + haystack.len()) time.

This routine is also guaranteed to have worst case constant space complexity.

Examples

use janetrs::JanetBuffer;

let s = JanetBuffer::from("foo bar baz");
assert_eq!(Some(0), s.find("foo"));
assert_eq!(Some(4), s.find("bar"));
assert_eq!(None, s.find("quux"));

Returns the index of the last occurrence of the given needle.

The needle may be any type that can be cheaply converted into a &[u8]. This includes, but is not limited to, &str and &[u8].

Complexity

This routine is guaranteed to have worst case linear time complexity with respect to both the needle and the haystack. That is, this runs in O(needle.len() + haystack.len()) time.

This routine is also guaranteed to have worst case constant space complexity.

Examples

use janetrs::JanetBuffer;

let s = JanetBuffer::from("foo bar baz");
assert_eq!(Some(0), s.rfind("foo"));
assert_eq!(Some(4), s.rfind("bar"));
assert_eq!(Some(8), s.rfind("ba"));
assert_eq!(None, s.rfind("quux"));

Returns the index of the first occurrence of the given byte. If the byte does not occur in this buffer, then None is returned.

Examples

use janetrs::JanetBuffer;

assert_eq!(Some(10), JanetBuffer::from("foo bar baz").find_byte(b'z'));
assert_eq!(None, JanetBuffer::from("foo bar baz").find_byte(b'y'));

Returns the index of the last occurrence of the given byte. If the byte does not occur in this buffer, then None is returned.

Examples

use janetrs::JanetBuffer;

assert_eq!(Some(10), JanetBuffer::from("foo bar baz").rfind_byte(b'z'));
assert_eq!(None, JanetBuffer::from("foo bar baz").rfind_byte(b'y'));

Returns the index of the first occurrence of the given codepoint. If the codepoint does not occur in this buffer, then None is returned.

Note that if one searches for the replacement codepoint, \u{FFFD}, then only explicit occurrences of that encoding will be found. Invalid UTF-8 sequences will not be matched.

Examples

use janetrs::JanetBuffer;

assert_eq!(Some(10), JanetBuffer::from("foo bar baz").find_char('z'));
assert_eq!(Some(4), JanetBuffer::from("αβγγδ").find_char('γ'));
assert_eq!(None, JanetBuffer::from("foo bar baz").find_char('y'));

Returns the index of the last occurrence of the given codepoint. If the codepoint does not occur in this buffer, then None is returned.

Note that if one searches for the replacement codepoint, \u{FFFD}, then only explicit occurrences of that encoding will be found. Invalid UTF-8 sequences will not be matched.

Examples

use janetrs::JanetBuffer;

assert_eq!(Some(10), JanetBuffer::from("foo bar baz").rfind_char('z'));
assert_eq!(Some(6), JanetBuffer::from("αβγγδ").rfind_char('γ'));
assert_eq!(None, JanetBuffer::from("foo bar baz").rfind_char('y'));

Returns the index of the first occurrence of any of the bytes in the provided set.

The byteset may be any type that can be cheaply converted into a &[u8]. This includes, but is not limited to, &str and &[u8], but note that passing a &str which contains multibyte characters may not behave as you expect: each byte in the &str is treated as an individual member of the byte set.

Note that order is irrelevant for the byteset parameter, and duplicate bytes present in its body are ignored.

Complexity

This routine is guaranteed to have worst case linear time complexity with respect to both the set of bytes and the haystack. That is, this runs in O(byteset.len() + haystack.len()) time.

This routine is also guaranteed to have worst case constant space complexity.

Examples

use janetrs::JanetBuffer;

assert_eq!(
    JanetBuffer::from("foo bar baz").find_byteset(b"zr"),
    Some(6)
);
assert_eq!(
    JanetBuffer::from("foo baz bar").find_byteset(b"bzr"),
    Some(4)
);
assert_eq!(None, JanetBuffer::from("foo baz bar").find_byteset(b"\t\n"));

Returns the index of the first occurrence of a byte that is not a member of the provided set.

The byteset may be any type that can be cheaply converted into a &[u8]. This includes, but is not limited to, &str and &[u8], but note that passing a &str which contains multibyte characters may not behave as you expect: each byte in the &str is treated as an individual member of the byte set.

Note that order is irrelevant for the byteset parameter, and duplicate bytes present in its body are ignored.

Complexity

This routine is guaranteed to have worst case linear time complexity with respect to both the set of bytes and the haystack. That is, this runs in O(byteset.len() + haystack.len()) time.

This routine is also guaranteed to have worst case constant space complexity.

Examples

use janetrs::JanetBuffer;

assert_eq!(
    JanetBuffer::from("foo bar baz").find_not_byteset(b"fo "),
    Some(4)
);
assert_eq!(
    JanetBuffer::from("\t\tbaz bar").find_not_byteset(b" \t\r\n"),
    Some(2)
);
assert_eq!(
    JanetBuffer::from("foo\nbaz\tbar").find_not_byteset(b"\t\n"),
    Some(0)
);

Returns the index of the last occurrence of any of the bytes in the provided set.

The byteset may be any type that can be cheaply converted into a &[u8]. This includes, but is not limited to, &str and &[u8], but note that passing a &str which contains multibyte characters may not behave as you expect: each byte in the &str is treated as an individual member of the byte set.

Note that order is irrelevant for the byteset parameter, and duplicate bytes present in its body are ignored.

Complexity

This routine is guaranteed to have worst case linear time complexity with respect to both the set of bytes and the haystack. That is, this runs in O(byteset.len() + haystack.len()) time.

This routine is also guaranteed to have worst case constant space complexity.

Examples

use janetrs::JanetBuffer;

assert_eq!(
    JanetBuffer::from("foo bar baz").rfind_byteset(b"agb"),
    Some(9)
);
assert_eq!(
    JanetBuffer::from("foo baz bar").rfind_byteset(b"rabz "),
    Some(10)
);
assert_eq!(
    JanetBuffer::from("foo baz bar").rfind_byteset(b"\n123"),
    None
);

Returns the index of the last occurrence of a byte that is not a member of the provided set.

The byteset may be any type that can be cheaply converted into a &[u8]. This includes, but is not limited to, &str and &[u8], but note that passing a &str which contains multibyte characters may not behave as you expect: each byte in the &str is treated as an individual member of the byte set.

Note that order is irrelevant for the byteset parameter, and duplicate bytes present in its body are ignored.

Complexity

This routine is guaranteed to have worst case linear time complexity with respect to both the set of bytes and the haystack. That is, this runs in O(byteset.len() + haystack.len()) time.

This routine is also guaranteed to have worst case constant space complexity.

Examples

use janetrs::JanetBuffer;

assert_eq!(
    JanetBuffer::from("foo bar baz,\t").rfind_not_byteset(b",\t"),
    Some(10)
);
assert_eq!(
    JanetBuffer::from("foo baz bar").rfind_not_byteset(b"rabz "),
    Some(2)
);
assert_eq!(
    None,
    JanetBuffer::from("foo baz bar").rfind_not_byteset(b"barfoz ")
);

Creates an iterator of the non-overlapping occurrences of the given needle. The iterator yields byte offset positions indicating the start of each match.

Complexity

This routine is guaranteed to have worst case linear time complexity with respect to both the needle and the haystack. That is, this runs in O(needle.len() + haystack.len()) time.

This routine is also guaranteed to have worst case constant space complexity.

Examples

Basic usage:

use janetrs::JanetBuffer;

let buff = JanetBuffer::from("foo bar foo foo quux foo");
let matches: Vec<usize> = buff.find_iter("foo").collect();
assert_eq!(matches, vec![0, 8, 12, 21]);

An empty string matches at every position, including the position immediately following the last byte:

use janetrs::JanetBuffer;

let matches: Vec<usize> = JanetBuffer::from("foo").find_iter("").collect();
assert_eq!(matches, vec![0, 1, 2, 3]);

let matches: Vec<usize> = JanetBuffer::from("").find_iter("").collect();
assert_eq!(matches, vec![0]);

Creates an iterator of the non-overlapping occurrences of the given needle in reverse. The iterator yields byte offset positions indicating the start of each match.

Complexity

This routine is guaranteed to have worst case linear time complexity with respect to both the needle and the haystack. That is, this runs in O(needle.len() + haystack.len()) time.

This routine is also guaranteed to have worst case constant space complexity.

Examples

Basic usage:

use janetrs::JanetBuffer;

let buff = JanetBuffer::from("foo bar foo foo quux foo");
let matches: Vec<usize> = buff.rfind_iter("foo").collect();
assert_eq!(matches, vec![21, 12, 8, 0]);

An empty string matches at every position, including the position immediately following the last byte:

use janetrs::JanetBuffer;

let matches: Vec<usize> = JanetBuffer::from("foo").rfind_iter("").collect();
assert_eq!(matches, vec![3, 2, 1, 0]);

let matches: Vec<usize> = JanetBuffer::from("").rfind_iter("").collect();
assert_eq!(matches, vec![0]);

Creates an iterator over the bytes of the JanetBuffer.

Examples

use janetrs::JanetBuffer;

let buff = JanetBuffer::from("Hello");

assert_eq!(buff.bytes().collect::<Vec<u8>>(), b"Hello");

Creates an iterator over the Unicode scalar values in this buffer. If invalid UTF-8 is encountered, then the Unicode replacement codepoint is yielded instead.

Examples

use janetrs::JanetBuffer;

let s = JanetBuffer::from(&b"\xE2\x98\x83\xFF\xF0\x9D\x9E\x83\xE2\x98\x61"[..]);

let chars: Vec<char> = s.chars().collect();
assert_eq!(vec!['☃', '\u{FFFD}', '𝞃', '\u{FFFD}', 'a'], chars);

Creates an iterator over the Unicode scalar values in this janet buffer along with their starting and ending byte index positions. If invalid UTF-8 is encountered, then the Unicode replacement codepoint is yielded instead.

Note that this is slightly different from the CharIndices iterator provided by the standard library. Aside from working on possibly invalid UTF-8, this iterator provides both the corresponding starting and ending byte indices of each codepoint yielded. The ending position is necessary to slice the original buffer when invalid UTF-8 bytes are converted into a Unicode replacement codepoint, since a single replacement codepoint can substitute anywhere from 1 to 3 invalid bytes (inclusive).

Examples

use janetrs::JanetBuffer;

let s = JanetBuffer::from(&b"\xE2\x98\x83\xFF\xF0\x9D\x9E\x83\xE2\x98\x61"[..]);

let chars: Vec<(usize, usize, char)> = s.char_indices().collect();
assert_eq!(chars, vec![
    (0, 3, '☃'),
    (3, 4, '\u{FFFD}'),
    (4, 8, '𝞃'),
    (8, 10, '\u{FFFD}'),
    (10, 11, 'a'),
]);

Creates an iterator over the fields in a buffer, separated by contiguous whitespace.

Example

Basic usage:

use janetrs::JanetBuffer;

let buff = JanetBuffer::from("  foo\tbar\t\u{2003}\nquux   \n");
let fields: Vec<&[u8]> = buff.fields().collect();
assert_eq!(fields, vec![
    "foo".as_bytes(),
    "bar".as_bytes(),
    "quux".as_bytes()
]);

A buffer consisting of just whitespace yields no elements:

use janetrs::JanetBuffer;

assert_eq!(
    0,
    JanetBuffer::from("  \n\t\u{2003}\n  \t").fields().count()
);

Creates an iterator over the fields in a buffer, separated by contiguous codepoints satisfying the given predicate.

If this string is not valid UTF-8, then the given closure will be called with a Unicode replacement codepoint when invalid UTF-8 bytes are seen.

Example

Basic usage:

use janetrs::JanetBuffer;

let buff = JanetBuffer::from("123foo999999bar1quux123456");
let fields: Vec<&[u8]> = buff.fields_with(|c| c.is_numeric()).collect();
assert_eq!(fields, vec![
    "foo".as_bytes(),
    "bar".as_bytes(),
    "quux".as_bytes()
]);

A buffer consisting of all codepoints satisfying the predicate yields no elements:

use janetrs::JanetBuffer;

assert_eq!(
    0,
    JanetBuffer::from("1911354563")
        .fields_with(|c| c.is_numeric())
        .count()
);

Creates an iterator over the grapheme clusters in this buffer along with their starting and ending byte index positions. If invalid UTF-8 is encountered, then the Unicode replacement codepoint is yielded instead.

Examples

This example shows how to get the byte offsets of each individual grapheme cluster:

use janetrs::JanetBuffer;

let bs = JanetBuffer::from("a\u{0300}\u{0316}\u{1F1FA}\u{1F1F8}");
let graphemes: Vec<(usize, usize, &str)> = bs.grapheme_indices().collect();
assert_eq!(vec![(0, 5, "à̖"), (5, 13, "🇺🇸")], graphemes);

This example shows what happens when invalid UTF-8 is encountered. Note that the offsets are valid indices into the original string, and do not necessarily correspond to the length of the &str returned!

use janetrs::JanetBuffer;

let mut bytes = JanetBuffer::new();
bytes.push_str("a\u{0300}\u{0316}");
bytes.push_u8(b'\xFF');
bytes.push_str("\u{1F1FA}\u{1F1F8}");

let graphemes: Vec<(usize, usize, &str)> = bytes.grapheme_indices().collect();
assert_eq!(graphemes, vec![
    (0, 5, "à̖"),
    (5, 6, "\u{FFFD}"),
    (6, 14, "🇺🇸")
]);

Creates an iterator over the grapheme clusters in this buffer. If invalid UTF-8 is encountered, then the Unicode replacement codepoint is yielded instead.

Examples

This example shows how multiple codepoints can combine to form a single grapheme cluster:

use janetrs::JanetBuffer;

let buff = JanetBuffer::from("a\u{0300}\u{0316}\u{1F1FA}\u{1F1F8}");
let graphemes: Vec<&str> = buff.graphemes().collect();
assert_eq!(vec!["à̖", "🇺🇸"], graphemes);

This shows that graphemes can be iterated over in reverse:

use janetrs::JanetBuffer;

let buff = JanetBuffer::from("a\u{0300}\u{0316}\u{1F1FA}\u{1F1F8}");
let graphemes: Vec<&str> = buff.graphemes().rev().collect();
assert_eq!(vec!["🇺🇸", "à̖"], graphemes);

Creates an iterator over all lines in a buffer, without their terminators.

For this iterator, the only line terminators recognized are \r\n and \n.

Examples

use janetrs::JanetBuffer;

let buff = JanetBuffer::from(
    &b"\
foo

bar\r
baz


quux"[..],
);
let lines: Vec<&[u8]> = buff.lines().collect();
assert_eq!(lines, vec![
    &b"foo"[..],
    &b""[..],
    &b"bar"[..],
    &b"baz"[..],
    &b""[..],
    &b""[..],
    &b"quux"[..],
]);

Creates an iterator over all lines in a buffer, including their terminators.

For this iterator, the only line terminator recognized is \n. (Since line terminators are included, this also handles \r\n line endings.)

Line terminators are only included if they are present in the original buffer. For example, the last line in a buffer may not end with a line terminator.

Concatenating all elements yielded by this iterator is guaranteed to yield the original buffer.

Examples

use janetrs::JanetBuffer;

let buff = JanetBuffer::from(
    &b"\
foo

bar\r
baz


quux"[..],
);
let lines: Vec<&[u8]> = buff.lines_with_terminator().collect();
assert_eq!(lines, vec![
    &b"foo\n"[..],
    &b"\n"[..],
    &b"bar\r\n"[..],
    &b"baz\n"[..],
    &b"\n"[..],
    &b"\n"[..],
    &b"quux"[..],
]);

Creates an iterator over the sentences in this buffer along with their starting and ending byte index positions.

Typically, a sentence will include its trailing punctuation and whitespace. Concatenating all elements yielded by the iterator results in the original string (modulo Unicode replacement codepoint substitutions if invalid UTF-8 is encountered).

Since sentences are made up of one or more codepoints, this iterator yields &str elements. When invalid UTF-8 is encountered, replacement codepoints are substituted.

Examples

Basic usage:

use janetrs::JanetBuffer;

let buff = JanetBuffer::from(&b"I want this. Not that. Right now."[..]);
let sentences: Vec<(usize, usize, &str)> = buff.sentence_indices().collect();
assert_eq!(sentences, vec![
    (0, 13, "I want this. "),
    (13, 23, "Not that. "),
    (23, 33, "Right now."),
]);

Creates an iterator over the sentences in this buffer.

Typically, a sentence will include its trailing punctuation and whitespace. Concatenating all elements yielded by the iterator results in the original string (modulo Unicode replacement codepoint substitutions if invalid UTF-8 is encountered).

Since sentences are made up of one or more codepoints, this iterator yields &str elements. When invalid UTF-8 is encountered, replacement codepoints are substituted.

Examples

Basic usage:

use janetrs::JanetBuffer;

let buff = JanetBuffer::from(&b"I want this. Not that. Right now."[..]);
let sentences: Vec<&str> = buff.sentences().collect();
assert_eq!(
    sentences,
    vec!["I want this. ", "Not that. ", "Right now.",]
);

Creates an iterator over substrings of this buffer, separated by the given buffer. Each element yielded is guaranteed not to include the splitter substring.

The splitter may be any type that can be cheaply converted into a &[u8]. This includes, but is not limited to, &str and &[u8].

Examples

Basic usage:

use janetrs::JanetBuffer;

let s = JanetBuffer::from("Mary had a little lamb");
let x: Vec<&[u8]> = s.split(" ").collect();
assert_eq!(x, vec![
    &b"Mary"[..],
    &b"had"[..],
    &b"a"[..],
    &b"little"[..],
    &b"lamb"[..],
]);

let s = JanetBuffer::from("");
let x: Vec<&[u8]> = s.split("X").collect();
assert_eq!(x, vec![&b""[..]]);

let s = JanetBuffer::from("lionXXtigerXleopard");
let x: Vec<&[u8]> = s.split("X").collect();
assert_eq!(x, vec![
    &b"lion"[..],
    &b""[..],
    &b"tiger"[..],
    &b"leopard"[..]
]);

let s = JanetBuffer::from("lion::tiger::leopard");
let x: Vec<&[u8]> = s.split("::").collect();
assert_eq!(x, vec![&b"lion"[..], &b"tiger"[..], &b"leopard"[..]]);

If a string contains multiple contiguous separators, you will end up with empty strings yielded by the iterator:

use janetrs::JanetBuffer;

let s = JanetBuffer::from("||||a||b|c");
let x: Vec<&[u8]> = s.split("|").collect();
assert_eq!(x, vec![
    &b""[..],
    &b""[..],
    &b""[..],
    &b""[..],
    &b"a"[..],
    &b""[..],
    &b"b"[..],
    &b"c"[..],
]);

let s = JanetBuffer::from("(///)");
let x: Vec<&[u8]> = s.split("/").collect();
assert_eq!(x, vec![&b"("[..], &b""[..], &b""[..], &b")"[..]]);

Separators at the start or end of a string are neighbored by empty strings.

use janetrs::JanetBuffer;

let s = JanetBuffer::from("010");
let x: Vec<&[u8]> = s.split("0").collect();
assert_eq!(x, vec![&b""[..], &b"1"[..], &b""[..]]);

When the empty string is used as a separator, it splits every byte in the string, along with the beginning and end of the string.

use janetrs::JanetBuffer;

let s = JanetBuffer::from("rust");
let x: Vec<&[u8]> = s.split("").collect();
assert_eq!(x, vec![
    &b""[..],
    &b"r"[..],
    &b"u"[..],
    &b"s"[..],
    &b"t"[..],
    &b""[..]
]);

// Splitting by an empty string is not UTF-8 aware. Elements yielded
// may not be valid UTF-8!
let s = JanetBuffer::from("☃");
let x: Vec<&[u8]> = s.split("").collect();
assert_eq!(x, vec![
    &b""[..],
    &b"\xE2"[..],
    &b"\x98"[..],
    &b"\x83"[..],
    &b""[..]
]);

Contiguous separators, especially whitespace, can lead to possibly surprising behavior. For example, this code is correct:

use janetrs::JanetBuffer;

let s = JanetBuffer::from("    a  b c");
let x: Vec<&[u8]> = s.split(" ").collect();
assert_eq!(x, vec![
    &b""[..],
    &b""[..],
    &b""[..],
    &b""[..],
    &b"a"[..],
    &b""[..],
    &b"b"[..],
    &b"c"[..]
]);

It does not give you ["a", "b", "c"]. For that behavior, use fields instead.

Creates an iterator over substrings of this buffer, separated by the given buffer. Each element yielded is guaranteed not to include the splitter substring.

The splitter may be any type that can be cheaply converted into a &[u8]. This includes, but is not limited to, &str and &[u8].

Examples

Basic usage:

use janetrs::JanetBuffer;

let s = JanetBuffer::from("Mary had a little lamb");
let x: Vec<&[u8]> = s.rsplit(" ").collect();
assert_eq!(x, vec![
    &b"lamb"[..],
    &b"little"[..],
    &b"a"[..],
    &b"had"[..],
    &b"Mary"[..],
]);

let s = JanetBuffer::from("");
let x: Vec<&[u8]> = s.rsplit("X").collect();
assert_eq!(x, vec![&b""[..]]);

let s = JanetBuffer::from("lionXXtigerXleopard");
let x: Vec<&[u8]> = s.rsplit("X").collect();
assert_eq!(x, vec![
    &b"leopard"[..],
    &b"tiger"[..],
    &b""[..],
    &b"lion"[..],
]);
let s = JanetBuffer::from("lion::tiger::leopard");
let x: Vec<&[u8]> = s.rsplit("::").collect();
assert_eq!(x, vec![&b"leopard"[..], &b"tiger"[..], &b"lion"[..]]);

If a buffer contains multiple contiguous separators, you will end up with empty strings yielded by the iterator:

use janetrs::JanetBuffer;

let s = JanetBuffer::from("||||a||b|c");
let x: Vec<&[u8]> = s.rsplit("|").collect();
assert_eq!(x, vec![
    &b"c"[..],
    &b"b"[..],
    &b""[..],
    &b"a"[..],
    &b""[..],
    &b""[..],
    &b""[..],
    &b""[..],
]);

let s = JanetBuffer::from("(///)");
let x: Vec<&[u8]> = s.rsplit("/").collect();
assert_eq!(x, vec![&b")"[..], &b""[..], &b""[..], &b"("[..]]);

Separators at the start or end of a string are neighbored by empty strings.

use janetrs::JanetBuffer;

let s = JanetBuffer::from("010");
let x: Vec<&[u8]> = s.rsplit("0").collect();
assert_eq!(x, vec![&b""[..], &b"1"[..], &b""[..]]);

When the empty string is used as a separator, it splits every byte in the string, along with the beginning and end of the string.

use janetrs::JanetBuffer;

let s = JanetBuffer::from("rust");
let x: Vec<&[u8]> = s.rsplit("").collect();
assert_eq!(x, vec![
    &b""[..],
    &b"t"[..],
    &b"s"[..],
    &b"u"[..],
    &b"r"[..],
    &b""[..]
]);

// Splitting by an empty string is not UTF-8 aware. Elements yielded
// may not be valid UTF-8!
let s = JanetBuffer::from("☃");
let x: Vec<&[u8]> = s.rsplit("").collect();
assert_eq!(x, vec![
    &b""[..],
    &b"\x83"[..],
    &b"\x98"[..],
    &b"\xE2"[..],
    &b""[..]
]);

Contiguous separators, especially whitespace, can lead to possibly surprising behavior. For example, this code is correct:

use janetrs::JanetBuffer;

let s = JanetBuffer::from("    a  b c");
let x: Vec<&[u8]> = s.rsplit(" ").collect();
assert_eq!(x, vec![
    &b"c"[..],
    &b"b"[..],
    &b""[..],
    &b"a"[..],
    &b""[..],
    &b""[..],
    &b""[..],
    &b""[..],
]);

It does not give you ["a", "b", "c"].

Creates an iterator of at most limit substrings of this buffer, separated by the given string. If limit substrings are yielded, then the last substring will contain the remainder of this buffer.

The needle may be any type that can be cheaply converted into a &[u8]. This includes, but is not limited to, &str and &[u8].

Examples

Basic usage:

use janetrs::JanetBuffer;

let s = JanetBuffer::from("Mary had a little lamb");
let x: Vec<_> = s.splitn(3, " ").collect();
assert_eq!(x, vec![&b"Mary"[..], &b"had"[..], &b"a little lamb"[..]]);

let s = JanetBuffer::from("");
let x: Vec<_> = s.splitn(3, "X").collect();
assert_eq!(x, vec![b""]);

let s = JanetBuffer::from("lionXXtigerXleopard");
let x: Vec<_> = s.splitn(3, "X").collect();
assert_eq!(x, vec![&b"lion"[..], &b""[..], &b"tigerXleopard"[..]]);

let s = JanetBuffer::from("lion::tiger::leopard");
let x: Vec<_> = s.splitn(2, "::").collect();
assert_eq!(x, vec![&b"lion"[..], &b"tiger::leopard"[..]]);

let s = JanetBuffer::from("abcXdef");
let x: Vec<_> = s.splitn(1, "X").collect();
assert_eq!(x, vec![&b"abcXdef"[..]]);

let s = JanetBuffer::from("abcdef");
let x: Vec<_> = s.splitn(2, "X").collect();
assert_eq!(x, vec![&b"abcdef"[..]]);

let s = JanetBuffer::from("abcXdef");
let x: Vec<_> = s.splitn(0, "X").collect();
assert!(x.is_empty());

Creates an iterator of at most limit substrings of this buffer, separated by the given string. If limit substrings are yielded, then the last substring will contain the remainder of this buffer.

The needle may be any type that can be cheaply converted into a &[u8]. This includes, but is not limited to, &str and &[u8].

Examples

Basic usage:

use janetrs::JanetBuffer;

let s = JanetBuffer::from("Mary had a little lamb");
let x: Vec<_> = s.rsplitn(3, " ").collect();
assert_eq!(x, vec![&b"lamb"[..], &b"little"[..], &b"Mary had a"[..]]);

let s = JanetBuffer::from("");
let x: Vec<_> = s.rsplitn(3, "X").collect();
assert_eq!(x, vec![b""]);

let s = JanetBuffer::from("lionXXtigerXleopard");
let x: Vec<_> = s.rsplitn(3, "X").collect();
assert_eq!(x, vec![&b"leopard"[..], &b"tiger"[..], &b"lionX"[..]]);

let s = JanetBuffer::from("lion::tiger::leopard");
let x: Vec<_> = s.rsplitn(2, "::").collect();
assert_eq!(x, vec![&b"leopard"[..], &b"lion::tiger"[..]]);

let s = JanetBuffer::from("abcXdef");
let x: Vec<_> = s.rsplitn(1, "X").collect();
assert_eq!(x, vec![&b"abcXdef"[..]]);

let s = JanetBuffer::from("abcdef");
let x: Vec<_> = s.rsplitn(2, "X").collect();
assert_eq!(x, vec![&b"abcdef"[..]]);

let s = JanetBuffer::from("abcXdef");
let x: Vec<_> = s.rsplitn(0, "X").collect();
assert!(x.is_empty());

Creates an iterator over chunks of valid UTF-8.

The iterator returned yields chunks of valid UTF-8 separated by invalid UTF-8 bytes, if they exist. Invalid UTF-8 bytes are always 1-3 bytes, which are determined via the “substitution of maximal subparts” strategy described in the docs for the to_str_lossy method.

Examples

use janetrs::JanetBuffer;

let buff = JanetBuffer::from(&b"foo\xFD\xFEbar\xFF"[..]);

let (mut valid_chunks, mut invalid_chunks) = (vec![], vec![]);
for chunk in buff.utf8_chunks() {
    if !chunk.valid().is_empty() {
        valid_chunks.push(chunk.valid());
    }
    if !chunk.invalid().is_empty() {
        invalid_chunks.push(chunk.invalid());
    }
}

assert_eq!(valid_chunks, vec!["foo", "bar"]);
assert_eq!(invalid_chunks, vec![b"\xFD", b"\xFE", b"\xFF"]);

Creates an iterator over the words in this buffer along with their starting and ending byte index positions.

This is similar to words_with_break_indices, except it only returns elements that contain a “word” character. A word character is defined by UTS #18 (Annex C) to be the combination of the Alphabetic and Join_Control properties, along with the Decimal_Number, Mark and Connector_Punctuation general categories.

Since words are made up of one or more codepoints, this iterator yields &str elements. When invalid UTF-8 is encountered, replacement codepoints are substituted.

Examples

This example shows how to get the byte offsets of each individual word:

use janetrs::JanetBuffer;

let buff = JanetBuffer::from(&b"can't jump 32.3 feet"[..]);
let words: Vec<(usize, usize, &str)> = buff.word_indices().collect();
assert_eq!(words, vec![
    (0, 5, "can't"),
    (6, 10, "jump"),
    (11, 15, "32.3"),
    (16, 20, "feet"),
]);

Creates an iterator over the words in this buffer. If invalid UTF-8 is encountered, then the Unicode replacement codepoint is yielded instead.

This is similar to words_with_breaks, except it only returns elements that contain a “word” character. A word character is defined by UTS #18 (Annex C) to be the combination of the Alphabetic and Join_Control properties, along with the Decimal_Number, Mark and Connector_Punctuation general categories.

Since words are made up of one or more codepoints, this iterator yields &str elements. When invalid UTF-8 is encountered, replacement codepoints are substituted.

Examples

Basic usage:

use janetrs::JanetBuffer;

let buff = JanetBuffer::from(&br#"The quick ("brown") fox can't jump 32.3 feet, right?"#[..]);
let words: Vec<&str> = buff.words().collect();
assert_eq!(words, vec![
    "The", "quick", "brown", "fox", "can't", "jump", "32.3", "feet", "right",
]);

Creates an iterator over the words and their byte offsets in this buffer, along with all breaks between the words. Concatenating all elements yielded by the iterator results in the original string (modulo Unicode replacement codepoint substitutions if invalid UTF-8 is encountered).

Since words are made up of one or more codepoints, this iterator yields &str elements. When invalid UTF-8 is encountered, replacement codepoints are substituted.

Examples

This example shows how to get the byte offsets of each individual word:

use janetrs::JanetBuffer;

let buff = JanetBuffer::from(&b"can't jump 32.3 feet"[..]);
let words: Vec<(usize, usize, &str)> = buff.words_with_break_indices().collect();
assert_eq!(words, vec![
    (0, 5, "can't"),
    (5, 6, " "),
    (6, 10, "jump"),
    (10, 11, " "),
    (11, 15, "32.3"),
    (15, 16, " "),
    (16, 20, "feet"),
]);

Creates an iterator over the words in this buffer, along with all breaks between the words. Concatenating all elements yielded by the iterator results in the original string (modulo Unicode replacement codepoint substitutions if invalid UTF-8 is encountered).

Since words are made up of one or more codepoints, this iterator yields &str elements. When invalid UTF-8 is encountered, replacement codepoints are substituted.

Examples

Basic usage:

use janetrs::JanetBuffer;

let buff = JanetBuffer::from(&br#"The quick ("brown") fox can't jump 32.3 feet, right?"#[..]);
let words: Vec<&str> = buff.words_with_breaks().collect();
assert_eq!(words, vec![
    "The", " ", "quick", " ", "(", "\"", "brown", "\"", ")", " ", "fox", " ", "can't", " ",
    "jump", " ", "32.3", " ", "feet", ",", " ", "right", "?",
]);

Return a raw pointer to the buffer raw structure.

The caller must ensure that the buffer outlives the pointer this function returns, or else it will end up pointing to garbage.

If you need to mutate the contents of the slice, use as_mut_ptr.

Return a raw mutable pointer to the buffer raw structure.

The caller must ensure that the buffer outlives the pointer this function returns, or else it will end up pointing to garbage.

Converts a buffer to a raw pointer.

The caller must ensure that the buffer outlives the pointer this function returns, or else it will end up pointing to garbage.

Converts a mutable buffer slice to a raw pointer.

The caller must ensure that the buffer outlives the pointer this function returns, or else it will end up pointing to garbage.

Trait Implementations

Performs the conversion.

Performs the conversion.

Performs the conversion.

Performs the conversion.

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

Returns the “default value” for a type. Read more

Formats the value using the given formatter. Read more

Extends a collection with the contents of an iterator. Read more

🔬 This is a nightly-only experimental API. (extend_one)

Extends a collection with exactly one element.

🔬 This is a nightly-only experimental API. (extend_one)

Reserves capacity in a collection for the given number of additional elements. Read more

Extends a collection with the contents of an iterator. Read more

🔬 This is a nightly-only experimental API. (extend_one)

Extends a collection with exactly one element.

🔬 This is a nightly-only experimental API. (extend_one)

Reserves capacity in a collection for the given number of additional elements. Read more

Extends a collection with the contents of an iterator. Read more

🔬 This is a nightly-only experimental API. (extend_one)

Extends a collection with exactly one element.

🔬 This is a nightly-only experimental API. (extend_one)

Reserves capacity in a collection for the given number of additional elements. Read more

Extends a collection with the contents of an iterator. Read more

🔬 This is a nightly-only experimental API. (extend_one)

Extends a collection with exactly one element.

🔬 This is a nightly-only experimental API. (extend_one)

Reserves capacity in a collection for the given number of additional elements. Read more

Extends a collection with the contents of an iterator. Read more

🔬 This is a nightly-only experimental API. (extend_one)

Extends a collection with exactly one element.

🔬 This is a nightly-only experimental API. (extend_one)

Reserves capacity in a collection for the given number of additional elements. Read more

Extends a collection with the contents of an iterator. Read more

🔬 This is a nightly-only experimental API. (extend_one)

Extends a collection with exactly one element.

🔬 This is a nightly-only experimental API. (extend_one)

Reserves capacity in a collection for the given number of additional elements. Read more

Extends a collection with the contents of an iterator. Read more

🔬 This is a nightly-only experimental API. (extend_one)

Extends a collection with exactly one element.

🔬 This is a nightly-only experimental API. (extend_one)

Reserves capacity in a collection for the given number of additional elements. Read more

Performs the conversion.

Performs the conversion.

Performs the conversion.

Performs the conversion.

Performs the conversion.

Performs the conversion.

Performs the conversion.

Performs the conversion.

Performs the conversion.

Performs the conversion.

Performs the conversion.

Performs the conversion.

Performs the conversion.

Performs the conversion.

Performs the conversion.

Performs the conversion.

Performs the conversion.

Performs the conversion.

Performs the conversion.

Performs the conversion.

Creates a value from an iterator. Read more

Creates a value from an iterator. Read more

Creates a value from an iterator. Read more

Creates a value from an iterator. Read more

Creates a value from an iterator. Read more

The associated error which can be returned from parsing.

Parses a string s to return a value of this type. Read more

Get a reference to the byte of the buffer at the index.

It is more idiomatic to use bytes method.

Janet Panics

Panics if the index is out of bounds.

The returned type after indexing.

Get a exclusive reference to the byte of the string at the index.

It is more idiomatic to use bytes_mut method.

Janet Panics

Panics if the index is out of bounds.

This method returns an Ordering between self and other. Read more

Compares and returns the maximum of two values. Read more

Compares and returns the minimum of two values. Read more

Restrict a value to a certain interval. Read more

This method tests for self and other values to be equal, and is used by ==. Read more

This method tests for !=.

This method tests for self and other values to be equal, and is used by ==. Read more

This method tests for !=.

This method tests for self and other values to be equal, and is used by ==. Read more

This method tests for !=.

This method tests for self and other values to be equal, and is used by ==. Read more

This method tests for !=.

This method tests for self and other values to be equal, and is used by ==. Read more

This method tests for !=.

This method tests for self and other values to be equal, and is used by ==. Read more

This method tests for !=.

This method tests for self and other values to be equal, and is used by ==. Read more

This method tests for !=.

This method tests for self and other values to be equal, and is used by ==. Read more

This method tests for !=.

This method tests for self and other values to be equal, and is used by ==. Read more

This method tests for !=.

This method tests for self and other values to be equal, and is used by ==. Read more

This method tests for !=.

This method tests for self and other values to be equal, and is used by ==. Read more

This method tests for !=.

This method returns an ordering between self and other values if one exists. Read more

This method tests less than (for self and other) and is used by the < operator. Read more

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

This method tests greater than (for self and other) and is used by the > operator. Read more

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

This method returns an ordering between self and other values if one exists. Read more

This method tests less than (for self and other) and is used by the < operator. Read more

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

This method tests greater than (for self and other) and is used by the > operator. Read more

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

This method returns an ordering between self and other values if one exists. Read more

This method tests less than (for self and other) and is used by the < operator. Read more

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

This method tests greater than (for self and other) and is used by the > operator. Read more

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

This method returns an ordering between self and other values if one exists. Read more

This method tests less than (for self and other) and is used by the < operator. Read more

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

This method tests greater than (for self and other) and is used by the > operator. Read more

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

This method returns an ordering between self and other values if one exists. Read more

This method tests less than (for self and other) and is used by the < operator. Read more

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

This method tests greater than (for self and other) and is used by the > operator. Read more

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

This method returns an ordering between self and other values if one exists. Read more

This method tests less than (for self and other) and is used by the < operator. Read more

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

This method tests greater than (for self and other) and is used by the > operator. Read more

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

This method returns an ordering between self and other values if one exists. Read more

This method tests less than (for self and other) and is used by the < operator. Read more

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

This method tests greater than (for self and other) and is used by the > operator. Read more

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

This method returns an ordering between self and other values if one exists. Read more

This method tests less than (for self and other) and is used by the < operator. Read more

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

This method tests greater than (for self and other) and is used by the > operator. Read more

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

This method returns an ordering between self and other values if one exists. Read more

This method tests less than (for self and other) and is used by the < operator. Read more

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

This method tests greater than (for self and other) and is used by the > operator. Read more

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

This method returns an ordering between self and other values if one exists. Read more

This method tests less than (for self and other) and is used by the < operator. Read more

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

This method tests greater than (for self and other) and is used by the > operator. Read more

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

This method returns an ordering between self and other values if one exists. Read more

This method tests less than (for self and other) and is used by the < operator. Read more

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

This method tests greater than (for self and other) and is used by the > operator. Read more

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

The type returned in the event of a conversion error.

Performs the conversion.

Writes a string slice into this writer, returning whether the write succeeded. Read more

Writes a char into this writer, returning whether the write succeeded. Read more

Glue for usage of the write! macro with implementors of this trait. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Performs the conversion.

Performs the conversion.

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

Uses borrowed data to replace owned data, usually by cloning. Read more

Converts the given value to a String. Read more

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.