#range #adjacent #compose #end #start #range-ext

rangecutter

处理相邻范围的实用工具

1 个不稳定版本

0.1.0 2024 年 4 月 18 日

1117Rust 模式

MIT 许可证

9KB
93

rangecutter

处理相邻范围的实用工具。

use std::ops::Range;
use rangecutter::RangeExt;

let source = "Line 1\nLine 2\n";

fn first_newline(s: &str) -> Option<Range<usize>> {
    let sep = '\n';

    let start = s.find(sep)?;
    let end = start + sep.len_utf8();

    Some(start..end)
}

let mut cursor = 0..source.len();

let lines_with_endings = std::iter::from_fn(|| {
    let separator = match first_newline(&source[cursor.clone()]) {
        Some(newline) => cursor.compose(&newline),
        None if !cursor.is_empty() => {
            cursor.end..cursor.end
        }
        None => return None,
    };

    let line;
    (line, cursor) = cursor.cut(&separator);

    let line_with_separator = line.concat(&separator);

    Some(&source[line_with_separator])
}).collect::<Vec<_>>();

assert_eq!(
    lines_with_endings,
    [
        "Line 1\n",
        "Line 2\n",
    ],
);

限制

仅支持完全有界的包含范围 (Range<T>)。

许可证:MIT

无运行时依赖