chore 0.1.0

plain-text command-line task management utility
Documentation
use crate::field::Stage;
use crate::token::Token;
use std::ops::Range;

pub struct TaskIter<'a> {
    remaining: &'a str,
    tokens: std::str::SplitAsciiWhitespace<'a>,
    offset: usize,
    stage: Stage,
}

impl<'a> TaskIter<'a> {
    pub fn new(str: &'a str) -> Self {
        TaskIter {
            remaining: str,
            tokens: str.split_ascii_whitespace(),
            offset: 0,
            stage: Stage::new(),
        }
    }
}

impl<'a> Iterator for TaskIter<'a> {
    type Item = (Token<'a>, Range<usize>);

    fn next(&mut self) -> Option<Self::Item> {
        let token = if self
            .remaining
            .starts_with(|c: char| c.is_ascii_whitespace())
        {
            self.remaining
                .split(|c: char| !c.is_ascii_whitespace())
                .next()
        } else {
            self.tokens.next()
        }?;

        let (token, stage) = Token::new(token, self.stage);
        let len = token.len();
        let range = self.offset..self.offset + len;
        self.remaining = &self.remaining[len..];
        self.stage = stage;
        self.offset += len;

        Some((token, range))
    }
}