use super::{AppModel, Deriver, Roots, Snapshot};
use crate::projects::runner::BlRunner;
use crate::state::{DirtySet, latest_snapshot, new_snapshot_cell};
use crate::ui_state::{Clock, UiState};
use crate::watch::Mark;
use std::path::PathBuf;
use std::sync::Arc;
impl AppModel {
pub fn boot(
roots: Roots,
clock: Arc<dyn Clock>,
balls: Box<dyn BlRunner>,
user: Option<String>,
) -> (Self, Deriver) {
let ui = UiState::open(roots.ui_json());
let dirty = DirtySet::default();
let cell = new_snapshot_cell(Arc::new(Snapshot::empty(clock.unix())));
let mut deriver = Deriver::new(
roots.clone(),
Arc::clone(&clock),
balls,
dirty.clone(),
Arc::clone(&cell),
);
deriver.boot();
let snap = latest_snapshot(&cell);
let model = Self {
snap,
roots,
ui,
cell,
clock,
dirty,
identity_user: user,
};
(model, deriver)
}
pub(crate) fn mark_dirty<I: IntoIterator<Item = PathBuf>>(&self, roots: I) {
self.dirty
.mark_all(roots.into_iter().map(|r| (r, Mark::Watch)));
}
}