1use crate::{tt::prelude::*, zero::LabelSegment};
3use std::ops::Index;
4
5#[derive(Clone, PartialEq, Eq)]
15pub struct Row<T>(Rc<IndexMap<FieldName, (LabelSegment, T)>>);
16
17impl<T> Index<FieldName> for Row<T> {
18 type Output = T;
19 fn index(&self, index: FieldName) -> &Self::Output {
20 self.get(index).unwrap()
21 }
22}
23
24impl<T> Row<T> {
25 pub fn get(&self, name: FieldName) -> Option<&T> {
29 self.0.get(&name).map(|p| &p.1)
30 }
31
32 pub fn iter(&self) -> impl Iterator<Item = (&FieldName, &(LabelSegment, T))> {
34 self.0.iter()
35 }
36
37 pub fn len(&self) -> usize {
39 self.0.len()
40 }
41
42 pub fn is_empty(&self) -> bool {
44 self.0.is_empty()
45 }
46
47 pub fn has(&self, field_name: FieldName) -> bool {
49 self.0.contains_key(&field_name)
50 }
51
52 pub fn empty() -> Self {
54 Self(Rc::new(IndexMap::new()))
55 }
56
57 pub fn map<S>(&self, f: impl Fn(&T) -> S) -> Row<S> {
59 self.iter().map(|(name, (label, x))| (*name, (*label, f(x)))).collect()
60 }
61}
62
63impl<T: Clone> Row<T> {
64 pub fn insert(mut self, field: FieldName, label: LabelSegment, value: T) -> Self {
69 Rc::make_mut(&mut self.0).insert(field, (label, value));
70 self
71 }
72}
73
74impl<T> FromIterator<(FieldName, (LabelSegment, T))> for Row<T> {
75 fn from_iter<I>(iter: I) -> Self
76 where
77 I: IntoIterator<Item = (FieldName, (LabelSegment, T))>,
78 {
79 Row(Rc::new(iter.into_iter().collect()))
80 }
81}
82
83impl<T> From<IndexMap<FieldName, (LabelSegment, T)>> for Row<T> {
84 fn from(value: IndexMap<FieldName, (LabelSegment, T)>) -> Self {
85 Self(Rc::new(value))
86 }
87}