Skip to content

Instantly share code, notes, and snippets.

@ProgramRipper
Created October 22, 2022 12:19
Show Gist options
  • Select an option

  • Save ProgramRipper/1991c5f00f3310712d9f48d953d04035 to your computer and use it in GitHub Desktop.

Select an option

Save ProgramRipper/1991c5f00f3310712d9f48d953d04035 to your computer and use it in GitHub Desktop.
teague_resolve_requirements
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