rand_functors/
functors.rs

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#[cfg(feature = "alloc")]
use alloc::vec;
#[cfg(feature = "alloc")]
use alloc::vec::Vec;
#[cfg(feature = "std")]
use std::collections::{HashMap, HashSet};
#[cfg(feature = "std")]
use std::hash::BuildHasher;

use num_traits::NumAssign;

use crate::{Functor, Inner};

impl<I: Inner> Functor<I> for I {
    #[inline]
    fn pure(i: I) -> I {
        i
    }
}

#[cfg(feature = "alloc")]
impl<I: Inner> Functor<I> for Vec<I> {
    #[inline]
    fn pure(i: I) -> Self {
        vec![i]
    }
}

#[cfg(feature = "std")]
impl<I: Inner, N: Clone + Default + NumAssign, S: BuildHasher + Default> Functor<I>
    for HashMap<I, N, S>
{
    #[inline]
    fn pure(i: I) -> Self {
        let mut hm = Self::default();
        hm.insert(i, N::one());
        hm
    }
}

#[cfg(feature = "std")]
impl<I: Inner, S: BuildHasher + Default> Functor<I> for HashSet<I, S> {
    fn pure(i: I) -> Self {
        let mut hs = Self::default();
        hs.insert(i);
        hs
    }
}