xee_interpreter/sequence/variant/
one.rs

1use crate::sequence::AtomizedItemIter;
2use crate::{atomic, error};
3
4use crate::sequence::item::Item;
5use crate::sequence::traits::{SequenceCompare, SequenceCore, SequenceExt, SequenceOrder};
6
7// this size should be below a usize
8const MAXIMUM_RANGE_SIZE: i64 = 2_i64.pow(25);
9
10#[derive(Debug, Clone, PartialEq)]
11pub struct One {
12    item: Item,
13}
14
15impl One {
16    pub(crate) fn item(&self) -> &Item {
17        &self.item
18    }
19
20    pub(crate) fn into_item(self) -> Item {
21        self.item
22    }
23}
24
25impl From<Item> for One {
26    fn from(item: Item) -> Self {
27        One { item }
28    }
29}
30
31impl From<One> for Item {
32    fn from(one: One) -> Self {
33        one.item
34    }
35}
36
37impl<'a> SequenceCore<'a, std::iter::Once<Item>> for One {
38    #[inline]
39    fn is_empty(&self) -> bool {
40        false
41    }
42
43    #[inline]
44    fn len(&self) -> usize {
45        1
46    }
47
48    #[inline]
49    fn get(&self, index: usize) -> Option<Item> {
50        if index == 0 {
51            Some(self.item.clone())
52        } else {
53            None
54        }
55    }
56
57    #[inline]
58    fn one(self) -> error::Result<Item> {
59        Ok(self.item)
60    }
61
62    #[inline]
63    fn option(self) -> error::Result<Option<Item>> {
64        Ok(Some(self.item))
65    }
66
67    #[inline]
68    fn iter(&'a self) -> std::iter::Once<Item> {
69        std::iter::once(self.item.clone())
70    }
71
72    #[inline]
73    fn effective_boolean_value(&self) -> error::Result<bool> {
74        self.item.effective_boolean_value()
75    }
76
77    #[inline]
78    fn string_value(&self, xot: &xot::Xot) -> error::Result<String> {
79        self.item.string_value(xot)
80    }
81}
82
83impl<'a, I> SequenceExt<'a, I> for One
84where
85    I: Iterator<Item = Item> + 'a,
86    One: SequenceCore<'a, I>,
87{
88    fn atomized(
89        &'a self,
90        xot: &'a xot::Xot,
91    ) -> impl Iterator<Item = error::Result<atomic::Atomic>> + 'a {
92        AtomizedItemIter::new(&self.item, xot)
93    }
94}
95
96impl<'a, I> SequenceCompare<'a, I> for One
97where
98    I: Iterator<Item = Item> + 'a,
99    One: SequenceCore<'a, I>,
100{
101}
102
103impl<'a, I> SequenceOrder<'a, I> for One
104where
105    I: Iterator<Item = Item>,
106    One: SequenceCore<'a, I>,
107{
108    fn one_node(&self) -> error::Result<xot::Node> {
109        match &self.item {
110            Item::Node(n) => Ok(*n),
111            _ => Err(error::Error::XPTY0004),
112        }
113    }
114}