py_declare/
lib.rs

1mod branch;
2mod error;
3mod filter;
4mod graph;
5mod group;
6mod res;
7pub use branch::*;
8pub use error::*;
9pub use filter::*;
10pub use graph::*;
11pub use group::*;
12pub use res::*;
13
14pub mod defs;
15pub mod mir;
16pub use defs::Defs;
17
18type Result<T, E = DeclareError> = std::result::Result<T, E>;
19
20#[cfg(test)]
21mod tests {
22
23    use super::*;
24
25    #[test]
26    fn feature() {
27        // ty!(1-5) is used to emulate the type A-E
28        //
29        // m() -> A | B | C
30        // b() -> B | C | D
31        // p(A, B) -> C
32        // p(B, C) -> D
33        // p(C, D) -> E
34
35        let no_span = terl::Span::new(0, 0);
36        let ordered_span = |idx: usize| terl::Span::new(idx, idx + 1);
37
38        use py_ir::types::{ComplexType, TypeDefine};
39
40        let raw_types = (0..6)
41            .map(|idx| TypeDefine::from(ComplexType::no_decorators(format!("t{idx}"))))
42            .collect::<Vec<_>>();
43        let types = raw_types
44            .iter()
45            .map(|raw| Type::from(raw.clone()))
46            .collect::<Vec<_>>();
47        let filters = raw_types
48            .iter()
49            .map(|raw| filters::TypeEqual::new(raw, no_span))
50            .collect::<Vec<_>>();
51
52        let mut map = DeclareGraph::new();
53        let defs = Defs::new();
54
55        let m1 = map.build_group(GroupBuilder::new(
56            ordered_span(1),
57            vec![
58                types[1].clone().into(),
59                types[2].clone().into(),
60                types[3].clone().into(),
61            ],
62        ));
63        let n1 = map.build_group(GroupBuilder::new(
64            ordered_span(2),
65            vec![
66                types[2].clone().into(),
67                types[3].clone().into(),
68                types[4].clone().into(),
69            ],
70        ));
71
72        let i = {
73            let gb = GroupBuilder::new(
74                ordered_span(11),
75                vec![
76                    BranchesBuilder::new(types[3].clone())
77                        .new_depend::<Directly, _>(&mut map, &defs, m1, &filters[1])
78                        .new_depend::<Directly, _>(&mut map, &defs, n1, &filters[2]),
79                    BranchesBuilder::new(types[4].clone())
80                        .new_depend::<Directly, _>(&mut map, &defs, m1, &filters[2])
81                        .new_depend::<Directly, _>(&mut map, &defs, n1, &filters[3]),
82                    BranchesBuilder::new(types[5].clone())
83                        .new_depend::<Directly, _>(&mut map, &defs, m1, &filters[3])
84                        .new_depend::<Directly, _>(&mut map, &defs, n1, &filters[4]),
85                ],
86            );
87
88            map.build_group(gb)
89        };
90
91        let m2 = map.build_group(GroupBuilder::new(
92            ordered_span(3),
93            vec![
94                types[1].clone().into(),
95                types[2].clone().into(),
96                types[3].clone().into(),
97            ],
98        ));
99        let n2 = map.build_group(GroupBuilder::new(
100            ordered_span(4),
101            vec![
102                types[2].clone().into(),
103                types[3].clone().into(),
104                types[4].clone().into(),
105            ],
106        ));
107        let j = {
108            let gb = GroupBuilder::new(
109                ordered_span(12),
110                vec![
111                    BranchesBuilder::new(types[3].clone())
112                        .new_depend::<Directly, _>(&mut map, &defs, m2, &filters[1])
113                        .new_depend::<Directly, _>(&mut map, &defs, n2, &filters[2]),
114                    BranchesBuilder::new(types[4].clone())
115                        .new_depend::<Directly, _>(&mut map, &defs, m2, &filters[2])
116                        .new_depend::<Directly, _>(&mut map, &defs, n2, &filters[3]),
117                    BranchesBuilder::new(types[5].clone())
118                        .new_depend::<Directly, _>(&mut map, &defs, m2, &filters[3])
119                        .new_depend::<Directly, _>(&mut map, &defs, n2, &filters[4]),
120                ],
121            );
122            map.build_group(gb)
123        };
124
125        let _k = {
126            let gb = GroupBuilder::new(
127                ordered_span(21),
128                vec![
129                    BranchesBuilder::new(types[3].clone())
130                        .new_depend::<Directly, _>(&mut map, &defs, i, &filters[1])
131                        .new_depend::<Directly, _>(&mut map, &defs, j, &filters[2]),
132                    BranchesBuilder::new(types[4].clone())
133                        .new_depend::<Directly, _>(&mut map, &defs, i, &filters[2])
134                        .new_depend::<Directly, _>(&mut map, &defs, j, &filters[3]),
135                    BranchesBuilder::new(types[5].clone())
136                        .new_depend::<Directly, _>(&mut map, &defs, i, &filters[3])
137                        .new_depend::<Directly, _>(&mut map, &defs, j, &filters[4]),
138                ],
139            );
140            map.build_group(gb)
141        };
142
143        // map.make_sure(Branch::new(k, 0), DeclareError::Empty);
144
145        assert!(map.declare_all().is_ok());
146    }
147}