Skip to main content

interact/access/
hashset.rs

1use std::collections::HashSet;
2use std::hash::BuildHasher;
3use std::hash::Hash;
4use std::sync::Arc;
5
6use crate::access::{iter::ReflectIter, Access, ReflectDirect};
7use crate::climber::{ClimbError, Climber};
8use crate::node_tree::NodeTree;
9use crate::reflector::Reflector;
10
11impl<'a, K> ReflectIter<&'a dyn Access> for std::collections::hash_set::Iter<'a, K>
12where
13    K: Eq + Hash + Access,
14{
15    fn reflect_next(&mut self) -> Option<&'a dyn Access> {
16        match self.next() {
17            None => None,
18            Some(value) => Some(value),
19        }
20    }
21}
22
23impl<K, S> ReflectDirect for HashSet<K, S>
24where
25    K: Eq + Hash + Access,
26    S: BuildHasher,
27{
28    fn immut_reflector(&self, reflector: &Arc<Reflector>) -> NodeTree {
29        let mut i = Box::new(self.iter());
30        Reflector::reflect_set(reflector, &mut *i, "HashSet")
31    }
32
33    fn immut_climber<'a>(
34        &self,
35        _climber: &mut Climber<'a>,
36    ) -> Result<Option<NodeTree>, ClimbError> {
37        return Ok(None);
38    }
39
40    fn mut_climber<'a>(
41        &mut self,
42        _climber: &mut Climber<'a>,
43    ) -> Result<Option<NodeTree>, ClimbError> {
44        return Ok(None);
45    }
46}
47
48use interact_derive::derive_interact_opaque;
49
50derive_interact_opaque! {
51    #[interact(skip_bound(S))]
52    #[interact(immut_fn(len()))]
53    struct HashSet<K, S>
54    where
55        K: Eq + std::hash::Hash,
56        S: std::hash::BuildHasher;
57}