1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
pub mod dfa;
pub mod dot;
pub mod nfa;
pub mod regex;

use std::fmt::Debug;
use std::hash::Hash;

/// A generic alphabet.
///
/// `Eq`, `Ord`, and `Hash` are assumed to be provided for the finite set to
/// simplify data structures by allowing use of different map and set types.
pub trait Alphabet: Hash + Eq + Debug + Clone + Copy + Ord { }

impl<T> Alphabet for T where T: Hash + Eq + Debug + Clone + Copy + Ord { }

/// Ensure the length of a container as if by resize(max(len, n)).
trait Ensure<T: Clone> {
    fn ensure(&mut self, n: usize, item: T);
    fn ensure_default(&mut self, n: usize) where T: Default {
        self.ensure(n, T::default());
    }
}

impl<T: Clone> Ensure<T> for Vec<T> {
    fn ensure(&mut self, n: usize, item: T) {
        let new_len = self.len().max(n);
        self.resize(new_len, item);
    }
}