use super::*;
use melodium_macro::mel_treatment;
use std::collections::HashMap;
use std::sync::Arc;
#[mel_treatment(
input value Block<string>
output map Block<StringMap>
)]
pub async fn entry(key: string) {
if let Ok(value) = value
.recv_one()
.await
.map(|val| GetData::<String>::try_data(val).unwrap())
{
let mut new_map = HashMap::new();
new_map.insert(key.clone(), value);
let new_map = StringMap { map: new_map };
let _ = map.send_one(Value::Data(Arc::new(new_map))).await;
}
}
#[mel_treatment(
input map Block<StringMap>
output value Block<Option<string>>
)]
pub async fn get(key: string) {
if let Ok(map) = map.recv_one().await.map(|val| {
GetData::<Arc<dyn Data>>::try_data(val)
.unwrap()
.downcast_arc::<StringMap>()
.unwrap()
}) {
let _ = value.send_one(map.map.get(&key).cloned().into()).await;
}
}
#[mel_treatment(
input base Block<StringMap>
input value Block<string>
output map Block<StringMap>
)]
pub async fn insert(key: string) {
if let (Ok(base), Ok(value)) = (
base.recv_one().await.map(|val| {
GetData::<Arc<dyn Data>>::try_data(val)
.unwrap()
.downcast_arc::<StringMap>()
.unwrap()
}),
value
.recv_one()
.await
.map(|val| GetData::<String>::try_data(val).unwrap()),
) {
let mut new_map = Arc::unwrap_or_clone(base);
new_map.map.insert(key.clone(), value);
let _ = map.send_one(Value::Data(Arc::new(new_map))).await;
}
}
#[mel_treatment(
input base Block<StringMap>
input entries Block<StringMap>
output merged Block<StringMap>
)]
pub async fn merge() {
if let Ok(base) = base.recv_one().await.map(|val| {
GetData::<Arc<dyn Data>>::try_data(val)
.unwrap()
.downcast_arc::<StringMap>()
.unwrap()
}) {
if let Ok(entries) = entries.recv_one().await.map(|val| {
GetData::<Arc<dyn Data>>::try_data(val)
.unwrap()
.downcast_arc::<StringMap>()
.unwrap()
}) {
let mut new_map = Arc::unwrap_or_clone(base);
for (key, value) in &entries.map {
new_map.map.insert(key.clone(), value.clone());
}
let _ = merged.send_one(Value::Data(Arc::new(new_map))).await;
} else {
let _ = merged.send_one(Value::Data(base)).await;
}
}
}