binator_stream/
lib.rs

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// mod string_stream;
23// pub use string_stream::*;
24
25// #[cfg(feature = "bit_stream")]
26// mod bit_stream;
27// #[cfg(feature = "bit_stream")]
28// pub use bit_stream::*;
29
30#[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}