Private/Get-UpdateStepKeysInOrderByDependency.ps1

function  Get-UpdateStepKeysInOrderByDependency {
    param(
        [Parameter(Mandatory = $true)]
        [hashtable]$UpdateDictionary
    )
    
    $keysInOrder = New-Object System.Collections.Generic.List[string]

    $processedSteps = @{}

    $buffer = [array] $UpdateDictionary.Keys

    $index = 0
    $loopDetected = $true

    while ($buffer.Count -gt 0) {

        if ($index -ge $buffer.Count) {
            if ($loopDetected) {
                throw "Loop detected - Buffer was $buffer"
            }
            $index = 0
            $loopDetected = $true
        }
        $keyToCheck = $buffer[$index]

        if ($null -eq $UpdateDictionary[$keyToCheck].Dependencies -or $UpdateDictionary[$keyToCheck].Dependencies.Count -eq 0) {
            $keysInOrder.Add($keyToCheck);
            $buffer = [array] ($buffer | Where-Object { $_ -ne $keyToCheck })
            $processedSteps.Add($keyToCheck, $true)
            $loopDetected = $false
            continue;
        }

        $areAllDependencyProcessed = $true
        foreach ($dependency in $UpdateDictionary[$keyToCheck].Dependencies) {
            if (!$processedSteps.ContainsKey($dependency)) {
                $areAllDependencyProcessed = $false;
                break;
            }
        }

        if ($areAllDependencyProcessed) {
            $keysInOrder.Add($keyToCheck);
            $buffer = [array] ($buffer | Where-Object { $_ -ne $keyToCheck })
            $processedSteps.Add($keyToCheck, $true)
            $loopDetected = $false
            continue;
        }

        $index++
    }

    return $keysInOrder
}