Private/Merge-InfraPulseHashtable.ps1

function Merge-InfraPulseHashtable {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [System.Collections.IDictionary]$Base,

        [Parameter(Mandatory)]
        [System.Collections.IDictionary]$Override
    )

    $result = Copy-InfraPulseValue -Value $Base

    foreach ($key in $Override.Keys) {
        $overrideValue = $Override[$key]

        if (
            $result.Contains($key) -and
            $result[$key] -is [System.Collections.IDictionary] -and
            $overrideValue -is [System.Collections.IDictionary]
        ) {
            $result[$key] = Merge-InfraPulseHashtable -Base $result[$key] -Override $overrideValue
        }
        else {
            $result[$key] = Copy-InfraPulseValue -Value $overrideValue
        }
    }

    return $result
}