1use crate::tokens::Token;
2
3#[must_use]
4pub fn split<'a>(tokens: &'a [Token<'a>]) -> Vec<Vec<&'a Token<'a>>> {
7 tokens
8 .iter()
9 .fold(vec![], |mut acc: Vec<Vec<&Token>>, token| {
10 if token == &Token::GroupSeparator {
11 acc.push(vec![]);
12
13 return acc;
14 }
15
16 if acc.is_empty() {
17 acc.push(vec![]);
18 }
19
20 if let Some(last) = acc.last_mut() {
21 last.push(token);
22 }
23
24 acc
25 })
26 .into_iter()
27 .filter(|group| !group.is_empty())
28 .collect()
29}
30
31#[cfg(test)]
32mod tests {
33
34 use super::split;
35 use crate::tokens::Token;
36
37 #[test]
38 fn check_split() {
39 assert!(split(&[Token::GroupSeparator,]).is_empty());
40 assert_eq!(
41 split(&[Token::KeySelector("abc")]),
42 vec![vec![&Token::KeySelector("abc")]]
43 );
44 assert_eq!(
45 split(&[
46 Token::GroupSeparator,
47 Token::GroupSeparator,
48 Token::KeySelector("abc")
49 ]),
50 vec![vec![&Token::KeySelector("abc")]]
51 );
52 assert_eq!(
53 split(&[
54 Token::KeySelector("abc"),
55 Token::GroupSeparator,
56 Token::KeySelector("abc")
57 ]),
58 vec![
59 vec![&Token::KeySelector("abc")],
60 vec![&Token::KeySelector("abc")],
61 ]
62 );
63 }
64}