interact/access/
hashset.rs1use 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}