use crate::primes;
pub use primes::Cirru;
pub fn resolve_comma(xs: &mut Vec<Cirru>) {
loop {
let mut comma_pos: Option<usize> = None;
for (i, x) in xs.iter().enumerate() {
if let Cirru::List(ys) = x
&& let Some(Cirru::Leaf(s)) = ys.first()
&& &**s == ","
{
comma_pos = Some(i);
break;
}
}
if let Some(p) = comma_pos {
let mut to_insert = match xs.remove(p) {
Cirru::List(ys) => ys,
_ => unreachable!(),
};
to_insert.remove(0);
for (i, item) in to_insert.into_iter().enumerate() {
xs.insert(p + i, item);
}
} else {
break;
}
}
let mut i = 0;
while i < xs.len() {
if let Cirru::Leaf(s) = &xs[i] {
if &**s == "," {
xs.remove(i);
} else {
i += 1;
}
} else {
i += 1;
}
}
for x in &mut *xs {
if let Cirru::List(ys) = x {
resolve_comma(ys);
}
}
}
pub fn resolve_dollar(xs: &mut Vec<Cirru>) {
for x in &mut *xs {
if let Cirru::List(ys) = x {
resolve_dollar(ys);
}
}
loop {
let mut dollar_pos: Option<usize> = None;
for (i, x) in xs.iter().enumerate().rev() {
if let Cirru::Leaf(s) = x
&& &**s == "$"
{
dollar_pos = Some(i);
break;
}
}
if let Some(p) = dollar_pos {
let mut new_list = vec![Cirru::List(xs.drain(p + 1..).collect())];
xs.truncate(p);
xs.append(&mut new_list);
} else {
break;
}
}
}