use std::iter;
use std::ops::Deref;
use std::sync::Arc;
use super::io::bolt::BoltRecordFields;
use crate::value::ValueReceive;
#[derive(Debug)]
pub struct Record {
entries: Vec<(Arc<String>, Option<ValueReceive>)>,
}
impl Record {
pub(crate) fn new(keys: &[Arc<String>], fields: BoltRecordFields) -> Self {
assert_eq!(keys.len(), fields.len());
Self {
entries: iter::zip(keys.iter().map(Arc::clone), fields.into_iter().map(Some)).collect(),
}
}
pub fn keys(&self) -> impl Iterator<Item = Arc<String>> + '_ {
self.entries
.iter()
.filter_map(|(key, value)| value.as_ref().map(|_| Arc::clone(key)))
}
pub fn values(&self) -> impl Iterator<Item = &ValueReceive> {
self.entries
.iter()
.map(|(_, value)| value)
.filter_map(Option::as_ref)
}
pub fn into_values(self) -> impl Iterator<Item = ValueReceive> {
self.entries.into_iter().filter_map(|(_, value)| value)
}
pub fn entries(&self) -> impl Iterator<Item = (Arc<String>, &ValueReceive)> {
self.entries
.iter()
.filter_map(|(key, value)| value.as_ref().map(|value| (Arc::clone(key), value)))
}
pub fn into_entries(self) -> impl Iterator<Item = (Arc<String>, ValueReceive)> {
self.entries
.into_iter()
.filter_map(|(key, value)| value.map(|value| (key, value)))
}
pub fn value(&self, key: &str) -> Option<&ValueReceive> {
self.entries
.iter()
.filter_map(|(k, v)| v.as_ref().map(|v| (k, v)))
.find_map(|(k, v)| if k.deref() == key { Some(v) } else { None })
}
pub fn take_value(&mut self, key: &str) -> Option<ValueReceive> {
self.entries
.iter_mut()
.filter(|(k, _)| k.deref() == key)
.find_map(|(_, v)| v.take())
}
}