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 enum_map::{enum_map, EnumArray, EnumMap};

pub trait EnumMapExt<K, V> {
    fn map_ref<'a, F, T>(&'a self, f: F) -> EnumMap<K, T>
    where
        K: EnumArray<T>,
        V: 'a,
        F: FnMut(K, &'a V) -> T;
}

impl<K, V> EnumMapExt<K, V> for EnumMap<K, V>
where
    K: Copy + EnumArray<V>,
{
    fn map_ref<'a, F, T>(&'a self, mut f: F) -> EnumMap<K, T>
    where
        K: EnumArray<T>,
        V: 'a,
        F: FnMut(K, &'a V) -> T,
    {
        enum_map! {
            key => f(key, &self[key]),
        }
    }
}