Private/01-MergeAtlasResults.ps1

function Merge-AtlasCollectionResult {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [AtlasCollectionResult[]] $Result
    )

    $merged = [AtlasCollectionResult]::new()
    $nodes = [ordered]@{}
    $edges = [ordered]@{}
    $evidence = [ordered]@{}

    foreach ($item in $Result) {
        foreach ($node in $item.Nodes) {
            if ($null -eq $node -or [string]::IsNullOrWhiteSpace($node.Key)) {
                $merged.Status = 'partial'
                $merged.Warnings.Add('A collector returned a node without a graph key. The invalid node was omitted.')
                continue
            }
            if (-not $nodes.Contains($node.Key) -or $nodes[$node.Key].Status -eq 'unresolved') {
                $nodes[$node.Key] = $node
            }
        }

        foreach ($edge in $item.Edges) {
            if ($null -eq $edge -or [string]::IsNullOrWhiteSpace($edge.Key)) {
                $merged.Status = 'partial'
                $merged.Warnings.Add('A collector returned a relationship without a graph key. The invalid relationship was omitted.')
                continue
            }
            $edges[$edge.Key] = $edge
        }

        foreach ($record in $item.Evidence) {
            if ($null -eq $record -or [string]::IsNullOrWhiteSpace($record.Key)) {
                $merged.Status = 'partial'
                $merged.Warnings.Add('A collector returned evidence without a graph key. The invalid evidence record was omitted.')
                continue
            }
            $evidence[$record.Key] = $record
        }

        foreach ($warning in $item.Warnings) {
            $merged.Warnings.Add($warning)
        }
    }

    foreach ($node in $nodes.Values) {
        $merged.Nodes.Add($node)
    }
    foreach ($edge in $edges.Values) {
        $merged.Edges.Add($edge)
    }
    foreach ($record in $evidence.Values) {
        $merged.Evidence.Add($record)
    }

    if ($Result.Status -contains 'partial') {
        $merged.Status = 'partial'
    }

    $merged.Metrics = @{
        nodeCount = $merged.Nodes.Count
        edgeCount = $merged.Edges.Count
        evidenceCount = $merged.Evidence.Count
    }
    return $merged
}