rtic_syntax/
optimize.rs

1use std::collections::{BTreeSet, HashMap};
2
3use crate::{ast::App, Settings};
4
5pub fn app(app: &mut App, settings: &Settings) {
6    // "compress" priorities
7    // If the user specified, for example, task priorities of "1, 3, 6",
8    // compress them into "1, 2, 3" as to leave no gaps
9    if settings.optimize_priorities {
10        // all task priorities ordered in ascending order
11        let priorities = app
12            .hardware_tasks
13            .values()
14            .map(|task| Some(task.args.priority))
15            .chain(
16                app.software_tasks
17                    .values()
18                    .map(|task| Some(task.args.priority)),
19            )
20            .collect::<BTreeSet<_>>();
21
22        let map = priorities
23            .iter()
24            .cloned()
25            .zip(1..)
26            .collect::<HashMap<_, _>>();
27
28        for task in app.hardware_tasks.values_mut() {
29            task.args.priority = map[&Some(task.args.priority)];
30        }
31
32        for task in app.software_tasks.values_mut() {
33            task.args.priority = map[&Some(task.args.priority)];
34        }
35    }
36}