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}