xee_interpreter/sequence/
conversion.rs1use crate::{atomic, error, function};
2
3use super::{Item, Sequence};
4
5impl From<Item> for Sequence {
7 fn from(item: Item) -> Self {
8 Sequence::One(item.into())
9 }
10}
11
12impl From<xot::Node> for Sequence {
14 fn from(node: xot::Node) -> Self {
15 let item: Item = node.into();
16 item.into()
17 }
18}
19
20impl TryFrom<Sequence> for xot::Node {
22 type Error = error::Error;
23
24 fn try_from(sequence: Sequence) -> Result<Self, Self::Error> {
25 match sequence {
26 Sequence::One(item) => item.item().try_into(),
27 _ => Err(error::Error::XPTY0004),
28 }
29 }
30}
31
32impl TryFrom<Sequence> for function::Function {
33 type Error = error::Error;
34
35 fn try_from(sequence: Sequence) -> Result<Self, Self::Error> {
36 match sequence {
37 Sequence::One(item) => item.item().try_into(),
38 _ => Err(error::Error::XPTY0004),
39 }
40 }
41}
42
43impl From<function::Array> for Sequence {
45 fn from(array: function::Array) -> Self {
46 let item: Item = array.into();
47 item.into()
48 }
49}
50
51impl From<Sequence> for function::Array {
53 fn from(sequence: Sequence) -> Self {
54 let items = sequence
55 .iter()
56 .map(|item| {
57 let sequence: Sequence = item.into();
58 sequence
59 })
60 .collect::<Vec<_>>();
61
62 Self::new(items)
63 }
64}
65
66impl From<function::Map> for Sequence {
68 fn from(map: function::Map) -> Self {
69 let item: Item = map.into();
70 item.into()
71 }
72}
73
74impl<T> From<Option<T>> for Sequence
76where
77 T: Into<Item>,
78{
79 fn from(item: Option<T>) -> Self {
80 match item {
81 Some(item) => {
82 let item = item.into();
83 Sequence::One(item.into())
84 }
85 None => Sequence::default(),
86 }
87 }
88}
89
90impl<T> From<T> for Sequence
92where
93 T: Into<atomic::Atomic>,
94{
95 fn from(atomic: T) -> Self {
96 let atomic: atomic::Atomic = atomic.into();
97 let item: Item = atomic.into();
98 Sequence::One(item.into())
99 }
100}
101
102impl<T> From<Vec<T>> for Sequence
103where
104 T: Into<Item>,
105{
106 fn from(values: Vec<T>) -> Self {
107 let mut items = Vec::with_capacity(values.len());
108 for value in values {
109 let item: Item = value.into();
110 items.push(item);
111 }
112 Sequence::new(items)
113 }
114}
115
116impl FromIterator<Item> for Sequence {
118 fn from_iter<I: IntoIterator<Item = Item>>(iter: I) -> Self {
119 let items = iter.into_iter().collect::<Vec<_>>();
120 items.into()
121 }
122}
123
124impl<'a> FromIterator<&'a Item> for Sequence {
126 fn from_iter<I: IntoIterator<Item = &'a Item>>(iter: I) -> Self {
127 let items = iter.into_iter().cloned().collect::<Vec<_>>();
128 items.into()
129 }
130}
131
132impl FromIterator<atomic::Atomic> for Sequence {
134 fn from_iter<I: IntoIterator<Item = atomic::Atomic>>(iter: I) -> Self {
135 let items = iter.into_iter().map(Item::from).collect::<Vec<_>>();
136 items.into()
137 }
138}
139
140impl FromIterator<xot::Node> for Sequence {
142 fn from_iter<I: IntoIterator<Item = xot::Node>>(iter: I) -> Self {
143 let items = iter.into_iter().map(Item::from).collect::<Vec<_>>();
144 items.into()
145 }
146}