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
use num::{Num, Integer, Unsigned, Signed, Float};
use super::{Vec, VecItem};

pub trait VecItemNum: VecItem + Num {}
pub trait VecItemInt: VecItemNum + Integer {}
pub trait VecItemUnsigned: VecItemInt + Integer + Unsigned {}
pub trait VecItemSigned: VecItemInt + Integer + Signed {}
pub trait VecItemFloat: VecItemNum + Float {}

pub trait VecNum: Vec where Self::Item: VecItemNum {
    fn sum(&self) -> Self::Item;
    fn product(&self) -> Self::Item;
}

pub trait VecInt: Vec where Self::Item: VecItemInt {}

pub trait VecUnsigned: Vec where Self::Item: VecItemUnsigned {}

pub trait VecSigned: Vec where Self::Item: VecItemSigned {
    fn snake_length(&self) -> Self::Item;
}

pub trait VecFloat: Vec where Self::Item: VecItemFloat {
    fn length(&self) -> Self::Item;
}