Skip to content

Instantly share code, notes, and snippets.

@ivanignatiev
Created January 11, 2021 22:02
Show Gist options
  • Save ivanignatiev/aa94127ea97406d3f551e1f7472514bd to your computer and use it in GitHub Desktop.
Save ivanignatiev/aa94127ea97406d3f551e1f7472514bd to your computer and use it in GitHub Desktop.
Dependency resolving algorithm
class Configuration {
[string] $Name
[string[]] $DependsOnNames
}
$Configurations = @{
}
$Configurations += @{
configuration1 = [Configuration]@{
Name = "configuration1"
DependsOnNames = @()
}
}
$Configurations += @{
configuration2 = [Configuration]@{
Name = "configuration2"
DependsOnNames = @("configuration1")
}
}
$Configurations += @{
configuration3 = [Configuration]@{
Name = "configuration3"
DependsOnNames = @("configuration1", "configuration2")
}
}
$resolved = @()
while ($Configurations.Keys.Count -ne 0) {
$currentDepency = $null
foreach ($configurationName in $Configurations.Keys) {
$configuration = $Configurations[$configurationName]
if ($configuration.DependsOnNames.Count -eq 0) {
$currentDepency = $configuration.Name
}
}
if (($null -eq $currentDepency)) {
$ErrorMessage = "Unable to resolve configuration depencies: Circular dependency`r`n"
$ErrorMessage += "Unresolved configuration:`r`n"
foreach ($configurationName in $Configurations.Keys) {
$ErrorMessage += ("$configurationName : " + ($Configurations[$configurationName].DependsOnNames) + "`r`n")
}
Write-Error $ErrorMessage
return
}
if (($null -eq $Configurations[$currentDepency])) {
Write-Error "Configuration dependency $currentDepency is not found"
return
}
$Configurations.Remove($currentDepency)
foreach ($configurationName in $Configurations.Keys) {
$Configurations[$configurationName].DependsOnNames = $Configurations[$configurationName].DependsOnNames.Where({ $_ -ne $currentDepency })
}
$resolved += $currentDepency
}
Write-Host "Resolved:"
$resolved
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment