evix 1.0.1

Library-first async Nix evaluation engine
use std::sync::{Arc, atomic::AtomicBool};

use anyhow::Result;

use crate::{
  Config,
  EvalError,
  Event,
  state::{EvalAccumulator, EvalGraph},
};

pub async fn evaluate<F>(
  config: Config,
  cancel: Arc<AtomicBool>,
  mut on_event: F,
) -> Result<(EvalGraph, Vec<EvalError>)>
where
  F: FnMut(Event) -> Result<()>,
{
  let mut accumulator = EvalAccumulator::default();

  crate::async_master::run(config, Arc::clone(&cancel), |event| {
    accumulator.record(&event);
    let result = on_event(event);
    async move { result }
  })
  .await?;

  Ok((accumulator.graph, accumulator.errors))
}