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 49 50 51 52 53 54 55 56 57 58 59 60 61
#![cfg(not(feature = "no_object"))] use crate::any::Dynamic; use crate::def_package; use crate::engine::Map; use crate::parser::{ImmutableString, INT}; use crate::plugin::*; use crate::stdlib::vec::Vec; def_package!(crate:BasicMapPackage:"Basic object map utilities.", lib, { combine_with_exported_module!(lib, "map", map_functions); }); #[export_module] mod map_functions { #[inline(always)] pub fn has(map: &mut Map, prop: ImmutableString) -> bool { map.contains_key(&prop) } #[inline(always)] pub fn len(map: &mut Map) -> INT { map.len() as INT } #[inline(always)] pub fn clear(map: &mut Map) { map.clear(); } #[inline(always)] pub fn remove(x: &mut Map, name: ImmutableString) -> Dynamic { x.remove(&name).unwrap_or_else(|| ().into()) } #[rhai_fn(name = "mixin", name = "+=")] pub fn mixin(map1: &mut Map, map2: Map) { map2.into_iter().for_each(|(key, value)| { map1.insert(key, value); }); } #[rhai_fn(name = "+")] pub fn merge(mut map1: Map, map2: Map) -> Map { map2.into_iter().for_each(|(key, value)| { map1.insert(key, value); }); map1 } pub fn fill_with(map1: &mut Map, map2: Map) { map2.into_iter().for_each(|(key, value)| { map1.entry(key).or_insert(value); }); } #[cfg(not(feature = "no_index"))] pub mod indexing { pub fn keys(map: &mut Map) -> Vec<Dynamic> { map.iter().map(|(k, _)| k.clone().into()).collect() } pub fn values(map: &mut Map) -> Vec<Dynamic> { map.iter().map(|(_, v)| v.clone()).collect() } } }