xee_interpreter/sequence/variant/
one.rs1use crate::sequence::AtomizedItemIter;
2use crate::{atomic, error};
3
4use crate::sequence::item::Item;
5use crate::sequence::traits::{SequenceCompare, SequenceCore, SequenceExt, SequenceOrder};
6
7const 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}