concision_core/traits/misc/
sequential.rs

1/*
2    Appellation: sequential <module> [traits::misc]
3    Contrib: FL03 <jo3mccain@icloud.com>
4*/
5use num::traits::FromPrimitive;
6
7/// A trait for sequential data structures;
8/// This trait is implemented for iterators that have a known length.
9pub trait Sequence<T> {
10    const LENGTH: Option<usize> = None;
11
12    fn len(&self) -> usize;
13
14    fn is_empty(&self) -> bool {
15        self.len() == 0
16    }
17
18    fn elems(&self) -> T
19    where
20        T: FromPrimitive,
21    {
22        T::from_usize(self.len()).unwrap()
23    }
24}
25
26pub trait SequenceIter {
27    type Item;
28
29    fn len(&self) -> usize;
30}
31/*
32 ************* Implementations *************
33*/
34impl<T, I> SequenceIter for I
35where
36    I: ExactSizeIterator<Item = T>,
37{
38    type Item = T;
39
40    fn len(&self) -> usize {
41        self.len()
42    }
43}
44
45impl<T> Sequence<T> for Vec<T> {
46    fn len(&self) -> usize {
47        self.len()
48    }
49}
50
51impl<T> Sequence<T> for [T] {
52    fn len(&self) -> usize {
53        self.len()
54    }
55}
56
57impl<T, const N: usize> Sequence<T> for [T; N] {
58    const LENGTH: Option<usize> = Some(N);
59
60    fn len(&self) -> usize {
61        N
62    }
63}