pace26io 0.2.0

Utilities to read PACE26 instances and write answers
Documentation
use super::{super::binary_tree::*, *};
use std::io::Write;

impl<B: TopDownCursor> NewickWriter for B {
    fn write_newick_inner(&self, writer: &mut impl Write) -> std::io::Result<()> {
        match self.visit() {
            NodeType::Inner(left, right) => {
                write!(writer, "(")?;
                left.write_newick_inner(writer)?;
                write!(writer, ",")?;
                right.write_newick_inner(writer)?;
                write!(writer, ")")
            }
            NodeType::Leaf(Label(label)) => {
                write!(writer, "{label}")
            }
        }
    }
}

#[cfg(test)]
mod test {
    use super::*;

    fn to_string(tree: BinTree) -> String {
        let mut buffer: Vec<u8> = Vec::new();
        tree.top_down().write_newick(&mut buffer).unwrap();
        String::from_utf8(buffer).unwrap()
    }

    #[test]
    fn leaf() {
        let tree = BinTreeBuilder::default().new_leaf(Label(1234));
        assert_eq!(to_string(tree), "1234;");
    }

    #[test]
    fn pair() {
        let mut build = BinTreeBuilder::default();

        let l1 = build.new_leaf(Label(1234));
        let l2 = build.new_leaf(Label(5678));
        let tree = build.new_inner(NodeIdx::new(0), l1, l2);

        assert_eq!(to_string(tree), "(1234,5678);");
    }
}