dag_compute 0.1.0

A library for the construction of arbitrary computation DAGs and the expression of dataflow graphs
Documentation
use dag_compute::ComputationGraph;

use std::io::Write;
use std::collections::BTreeMap;

#[derive(Debug, Clone, PartialEq, Eq)]
enum HistogramFlow {
    RawString(String),
    Histogram(BTreeMap<char, usize>)
}

fn main() {
    let mut graph = ComputationGraph::<HistogramFlow>::new();
    let handle_in = graph.insert_node(
        "input".to_owned(),
        Box::new(|_| {
            print!("Enter string: ");
            std::io::stdout().flush().unwrap();
            let mut string_in = String::new();
            std::io::stdin().read_line(&mut string_in).unwrap();
            let trimmed = string_in.trim_end_matches('\n').to_owned();
            HistogramFlow::RawString(trimmed)
        })
    );
    let mut compute_histogram = graph.insert_node(
        "histogram".to_owned(),
        Box::new(|x| {
            if let HistogramFlow::RawString(s) = x[0] {
                let mut histogram: BTreeMap<char, usize> = BTreeMap::new();
                for char_val in s.chars() {
                    let entry = histogram.entry(char_val);
                    *entry.or_insert(0) += 1;
                }
                HistogramFlow::Histogram(histogram)
            } else {
                panic!("Expected RawString variant, got {:?}", x);
            }
        })
    );
    graph.set_inputs(&mut compute_histogram, &[&handle_in]);
    graph.designate_output(&compute_histogram);
    let final_val = graph.compute();
    if let HistogramFlow::Histogram(map) = final_val {
        for key in map.keys() {
            let count = map.get(key).unwrap();
            println!("{}: {}", key, count);
        }
    }
}