jellyflow-core 0.2.0

Headless graph model, IDs, type descriptors, and interaction policy primitives for Jellyflow.
Documentation
use crate::ops::GraphOp;

mod binding;
mod document;
mod edge;
mod node;
mod port;

pub(super) fn coalesce_setter_chains(ops: Vec<GraphOp>) -> Vec<GraphOp> {
    let mut out = Vec::with_capacity(ops.len());
    for op in ops {
        if let Some(last) = out.last_mut()
            && try_coalesce_setter(last, &op)
        {
            continue;
        }
        out.push(op);
    }
    out
}

fn try_coalesce_setter(last: &mut GraphOp, next: &GraphOp) -> bool {
    node::try_coalesce_node_setter(last, next)
        || port::try_coalesce_port_setter(last, next)
        || edge::try_coalesce_edge_setter(last, next)
        || document::try_coalesce_document_setter(last, next)
        || binding::try_coalesce_binding_setter(last, next)
}

fn coalesce_value<Id, T>(a: &Id, last_to: &mut T, b: &Id, from: &T, to: &T) -> bool
where
    Id: PartialEq,
    T: Clone + PartialEq,
{
    if a == b && last_to == from {
        *last_to = to.clone();
        true
    } else {
        false
    }
}