precedence-net 1.1.0

Create and analyse precedence networks
Documentation
use precedence_net::{Network, Result};

fn main() -> Result<()> {
    let mut network_builder = Network::builder();

    network_builder.add_activity("Design", 5.0)?;
    network_builder.add_activity("Develop", 6.0)?;
    network_builder.add_activity("Document", 4.0)?;
    network_builder.add_activity("Deploy", 1.0)?;
    network_builder.add_activity("Train", 3.0)?;
    network_builder.add_activity("Test", 4.0)?;

    network_builder.connect("Design", "Develop")?;
    network_builder.connect("Design", "Document")?;
    network_builder.connect("Develop", "Test")?;
    network_builder.connect("Develop", "Train")?;
    network_builder.connect("Test", "Deploy")?;
    network_builder.connect("Train", "Deploy")?;
    network_builder.connect("Document", "Deploy")?;

    let network = Network::try_from(network_builder)?;

    println!("Activity | Earliest Start | Earliest Finish | Latest Start | Latest Finish | Total Float | Free Float | Critical Path");
    println!("---------------------------------------------------------------------------------------------------------------------");
    for activity in network.activities()? {
        println!(
            "{:^8} | {:>14} | {:>15} | {:>12} | {:>13} | {:>11} | {:>10} | {:^14}",
            activity,
            network.earliest_start(activity)?,
            network.earliest_finish(activity)?,
            network.latest_start(activity)?,
            network.latest_finish(activity)?,
            network.total_float(activity)?,
            network.free_float(activity)?,
            network.on_critical_path(activity)?,
        );
    }
    Ok(())
}