Skip to main content

rust_dynamic/
map.rs

1use std::collections::hash_map::HashMap;
2use crate::value::Value;
3use crate::types::*;
4
5impl Value {
6    pub fn fmap(&mut self, appfn: AppFn) -> Self {
7        match self.dt {
8            JSON => {
9                let mut data: Vec<Value> = Vec::new();
10                match &self.data {
11                    Val::Json(v) => {
12                        if v.is_array() {
13                            for n in v.as_array().unwrap() {
14                                match Value::json(n.clone()).cast_json_to_value() {
15                                    Ok(value) => {
16                                        data.push(appfn(value));
17                                    }
18                                    Err(_) => {
19                                        continue;
20                                    }
21                                }
22                            }
23                        }
24                    }
25                    _ => {},
26                }
27                return Value::from_list(data);
28            }
29            LIST | RESULT => {
30                let mut data: Vec<Value> = Vec::new();
31                match &self.data {
32                    Val::List(v) => {
33                        for i in v {
34                            data.push(appfn(i.clone()));
35                        }
36                    }
37                    _ => {},
38                }
39                return Value::from_list(data);
40            }
41            LAMBDA => {
42                let mut data: Vec<Value> = Vec::new();
43                match &self.data {
44                    Val::Lambda(v) => {
45                        for i in v {
46                            data.push(appfn(i.clone()));
47                        }
48                    }
49                    _ => {},
50                }
51                return Value::to_lambda(data);
52            }
53            MAP | INFO | ASSOCIATION | CONFIG | CONDITIONAL | CLASS | OBJECT => {
54                let mut data: HashMap<String, Value> = HashMap::new();
55                let mut res = self.dup().unwrap().regen_id();
56                match &self.data {
57                    Val::Map(m_data) => {
58                        for (k,v) in m_data {
59                            data.insert(k.clone(), appfn(v.clone()));
60                        }
61                    }
62                    _ => {},
63                }
64                res.data = Val::Map(data);
65                return res;
66            }
67            VALUEMAP => {
68                let mut data: HashMap<Value, Value> = HashMap::new();
69                let mut res = self.dup().unwrap().regen_id();
70                match &self.data {
71                    Val::ValueMap(m_data) => {
72                        for (k,v) in m_data {
73                            data.insert(k.clone(), appfn(v.clone()));
74                        }
75                    }
76                    _ => {},
77                }
78                res.data = Val::ValueMap(data);
79                return res;
80            }
81            NONE => {
82                self.clone()
83            }
84            _ => {
85                let res = self.dup().unwrap().regen_id();
86                return appfn(res);
87            }
88        }
89    }
90    pub fn map_float(&mut self, appfn: FloatFn) -> Self {
91        if self.dt == LIST {
92            let mut data: Vec<Value> = Vec::new();
93            match &self.data {
94                Val::List(v) => {
95                    for i in v {
96                        if i.dt == FLOAT {
97                            data.push(Value::from_float(appfn(i.cast_float().unwrap())));
98                        }
99                    }
100                }
101                _ => {},
102            }
103            return Value::from_list(data);
104        }
105        if self.dt == FLOAT {
106            return Value::from_float(appfn(self.cast_float().unwrap()));
107        }
108        return Value::new();
109    }
110}