Created
October 22, 2022 12:19
-
-
Save ProgramRipper/1991c5f00f3310712d9f48d953d04035 to your computer and use it in GitHub Desktop.
teague_resolve_requirements
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| def resolve_requirements( | |
| querys: list[Query], integrates: list[Integrate] | |
| ) -> list[set[Integrate]]: | |
| # sourcery skip: use-named-expression | |
| query_intergrate_map: dict[Query, Integrate] = {} | |
| for query in querys: | |
| for integrate in integrates: | |
| if integrate.has_capability(query): | |
| query_intergrate_map[query] = integrate | |
| query.attaching = integrate # NOTE: 也许不需要? 或者说本来就需要根据这个解析依赖关系? | |
| break | |
| else: | |
| raise RequirementResolveFailed(f"Can not resolve {query}") | |
| dependency_map: dict[Integrate, set[Integrate]] = { | |
| integrate: set(map(query_intergrate_map.__getitem__, integrate.dependencies)) | |
| for integrate in integrates | |
| } | |
| resolved: set[Integrate] = set() | |
| unresolved: set[Integrate] = set(dependency_map) | |
| result: list[set[Integrate]] = [] | |
| while unresolved: | |
| layer: set[Integrate] = { | |
| intergrate | |
| for intergrate in unresolved | |
| if resolved >= dependency_map[intergrate] | |
| } | |
| if not layer: | |
| raise RequirementResolveFailed(unresolved) | |
| unresolved -= layer | |
| resolved |= layer | |
| result.append(layer) | |
| result.reverse() | |
| return result |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment