1#![doc = include_str!("../readme.md")]
2#![cfg_attr(not(test), no_std)]
3#![warn(missing_docs)]
4#![deny(clippy::default_numeric_fallback)]
5
6#[cfg(feature = "alloc")]
7extern crate alloc;
8
9#[cfg(feature = "std")]
10extern crate std;
11
12use core::ops::{
13 Range,
14 RangeFrom,
15};
16
17mod reader_stream;
18pub use reader_stream::*;
19
20mod vec_stream;
21pub use vec_stream::*;
22#[derive(Debug, Clone, PartialEq, Eq)]
31pub(crate) enum Position {
32 RangeFrom(RangeFrom<usize>),
33 Range(Range<usize>),
34}
35
36impl Position {
37 fn next(&self) -> (Option<usize>, Self) {
38 match self {
39 Position::RangeFrom(from) => {
40 let mut from = from.clone();
41 (from.next(), Position::RangeFrom(from))
42 }
43 Position::Range(range) => {
44 let mut range = range.clone();
45 (range.next(), Position::Range(range))
46 }
47 }
48 }
49
50 fn range(&self, b: &Self) -> Option<Range<usize>> {
51 let (a, b) = match (self, b) {
52 (Position::RangeFrom(a), Position::RangeFrom(b)) => (a.start, b.start),
53 (Position::RangeFrom(a), Position::Range(b)) => (a.start, b.start),
54 (Position::Range(a), Position::RangeFrom(b)) => (a.start, b.start),
55 (Position::Range(a), Position::Range(b)) => (a.start, b.start),
56 };
57
58 if a >= b { Some(a..a - b) } else { None }
59 }
60}