algebraeon-geometry 0.0.17

Algorithms for working with geometric shapes
Documentation
use crate::partial_simplicial_complex::PartialSimplicialComplex;
use algebraeon_nzq::RationalCanonicalStructure;
use lalrpop_util::lalrpop_mod;

lalrpop_mod!(shape_parser, "/parse/shape_grammar.rs");
mod ast;

pub fn parse_shape(string: &str) -> PartialSimplicialComplex<'static, RationalCanonicalStructure> {
    shape_parser::ShapeParser::new()
        .parse(string)
        .unwrap()
        .to_partial_simplicial_complex_root()
}

#[cfg(test)]
mod tests {
    use crate::parse::ast::{Point, SignedValue};

    use super::*;

    #[test]
    fn test() {
        assert_eq!(
            shape_parser::PointParser::new()
                .parse("(6, +7, -8, + 9, - 10)")
                .unwrap(),
            Point {
                coordinates: vec![
                    SignedValue {
                        sign: ast::Sign::Positive,
                        value: String::from("6")
                    },
                    SignedValue {
                        sign: ast::Sign::Positive,
                        value: String::from("7")
                    },
                    SignedValue {
                        sign: ast::Sign::Negative,
                        value: String::from("8")
                    },
                    SignedValue {
                        sign: ast::Sign::Positive,
                        value: String::from("9")
                    },
                    SignedValue {
                        sign: ast::Sign::Negative,
                        value: String::from("10")
                    }
                ]
            }
        );

        assert!(
            shape_parser::ShapeParser::new()
                .parse("ConvexHull((),(),)")
                .is_ok()
        );
        assert!(
            shape_parser::ShapeParser::new()
                .parse("ConvexHull((),())")
                .is_ok()
        );
        assert!(
            shape_parser::ShapeParser::new()
                .parse("ConvexHull((),)")
                .is_ok()
        );
        assert!(
            shape_parser::ShapeParser::new()
                .parse("ConvexHull(())")
                .is_ok()
        );
        assert!(
            shape_parser::ShapeParser::new()
                .parse("ConvexHull()")
                .is_ok()
        );
        assert!(
            shape_parser::ShapeParser::new()
                .parse("ConvexHull() | ConvexHull()")
                .is_ok()
        );
        assert!(
            shape_parser::ShapeParser::new()
                .parse("ConvexHull() | ConvexHull() |)")
                .is_err()
        );
        assert!(
            shape_parser::ShapeParser::new()
                .parse("ConvexHull() | ConvexHull() | ConvexHull()")
                .is_ok()
        );
        assert!(
            shape_parser::ShapeParser::new()
                .parse("ConvexHull() & ConvexHull()")
                .is_ok()
        );
        assert!(
            shape_parser::ShapeParser::new()
                .parse("ConvexHull() & ConvexHull() &")
                .is_err()
        );
        assert!(
            shape_parser::ShapeParser::new()
                .parse("ConvexHull() & ConvexHull() & ConvexHull()")
                .is_ok()
        );
        assert!(
            shape_parser::ShapeParser::new()
                .parse("ConvexHull() | ConvexHull() & ConvexHull()")
                .is_err()
        );
        assert!(
            shape_parser::ShapeParser::new()
                .parse("ConvexHull() & ConvexHull() | ConvexHull()")
                .is_err()
        );
        assert!(
            shape_parser::ShapeParser::new()
                .parse("ConvexHull() \\ ConvexHull()")
                .is_ok()
        );
        assert!(
            shape_parser::ShapeParser::new()
                .parse("ConvexHull() \\ ConvexHull() \\ ConvexHull()")
                .is_err()
        );
        assert!(
            shape_parser::ShapeParser::new()
                .parse("ConvexHull() \\ ConvexHull() | ConvexHull()")
                .is_err()
        );
        assert!(
            shape_parser::ShapeParser::new()
                .parse("(ConvexHull() \\ ConvexHull()) | ConvexHull()")
                .is_ok()
        );
        assert!(
            shape_parser::ShapeParser::new()
                .parse("ConvexHull() \\ ConvexHull() & ConvexHull()")
                .is_err()
        );
        assert!(
            shape_parser::ShapeParser::new()
                .parse("(ConvexHull() \\ ConvexHull()) & ConvexHull()")
                .is_ok()
        );
    }
}