use crate::{config, modules, sh, Segment}; use std::iter::once; pub fn prompt(shell: &str, args: &[config::Segment], f: T) where T: Fn(usize, (&Segment, &Segment, &Segment)) -> U, U: IntoIterator, { let v: Vec<_> = once(Segment::default()) .chain( args.iter() .map(|arg| { let mut segment = Segment { background: arg.color.background.to_string(), foreground: arg.color.foreground.to_string(), ..Default::default() }; modules::handle( arg.name.as_str(), &mut segment, arg.args .iter() .map(String::as_str) .collect::>() .as_slice(), ); segment }) .filter(|seg| !seg.value.is_empty()), ) .chain(once(Segment::default())) .collect(); let n = v.len() - 2; (0..n) .flat_map(|i| f(i, (&v[i], &v[i + 1], &v[i + 2]))) .for_each(|(bg, fg, val)| { print!( "{}{}{}", sh::escape_background(shell, &bg), sh::escape_foreground(shell, &fg), val, ); }); sh::reset_colors(shell); }