xee_interpreter/sequence/
conversion.rs

1use crate::{atomic, error, function};
2
3use super::{Item, Sequence};
4
5// turn a single item into a sequence
6impl From<Item> for Sequence {
7    fn from(item: Item) -> Self {
8        Sequence::One(item.into())
9    }
10}
11
12// turn a single node into a sequence
13impl From<xot::Node> for Sequence {
14    fn from(node: xot::Node) -> Self {
15        let item: Item = node.into();
16        item.into()
17    }
18}
19
20// turn a sequence into a single node
21impl 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
43// turn a single array into a sequence
44impl From<function::Array> for Sequence {
45    fn from(array: function::Array) -> Self {
46        let item: Item = array.into();
47        item.into()
48    }
49}
50
51// turn a sequence into an array
52impl 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
66// turn a single map into a sequence
67impl From<function::Map> for Sequence {
68    fn from(map: function::Map) -> Self {
69        let item: Item = map.into();
70        item.into()
71    }
72}
73
74// turn an option that can be turned into an item into a sequence
75impl<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
90// turn something that can be turned into an atomic into a sequence
91impl<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
116// turn an iterator of things that can be turned into items into a sequence
117impl 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
124// turn an iterator of item references into a sequence
125impl<'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
132// turn an iterator of atomics into a sequence
133impl 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
140// turn an iterator of nodes into a sequence
141impl 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}