Functions/UpdateHosts.ps1

function Update-Hosts {
    
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string] $Address,
        [Parameter(Mandatory)]
        [string[]] $Names
    )

    if ($Address.Length -eq 0) {

        Write-Error "Address argument is required" -ErrorAction Stop;
    }

    if ($Names.Count -eq 0) {

        Write-Error "Names argument is required" -ErrorAction Stop;
    }

    $hostsList = @();
    $hostsNamesList = @($Names);

    foreach ($hostRecord in Read-Hosts) {
        
        if ($hostRecord -is [HostRecord]) {

            # Define placeholder and fill it with found names
            $hostRecordPlaceholder = $null;

            # Iterate through hostnames that we didn't use yet
            foreach ($name in $hostsNamesList) {

                if ($hostRecord.Names -contains $name) {

                    if ($null -eq $hostRecordPlaceholder) {

                        # Create placeholder for new record
                        $hostRecordPlaceholder = [HostRecord]::new();
                        $hostRecordPlaceholder.Address = $Address;
                    }

                    # Add new name to current placeholder
                    $hostRecordPlaceholder.Names += $name;
                }
            }
            
            if ($null -ne $hostRecordPlaceholder) {

                # Remove name from the old record
                $hostRecord.Names = $hostRecord.Names | Where-Object { $PSItem -notin $hostRecordPlaceholder.Names };

                if ($hostRecord.Names.Count -eq 0) {

                    # Replace obsolete record with placeholder
                    $hostRecord = $hostRecordPlaceholder; 
                }
                else {

                    # Looks like we need to keep record, so just prepend placeholder with actual data
                    $hostsList += $hostRecordPlaceholder;
                }

                # Exlude host names we already added to the rusult list
                $hostsNamesList = $hostsNamesList | Where-Object { $PSItem -notin $hostRecordPlaceholder.Names };
            }
        }

        # Keep it as is
        $hostsList += $hostRecord;
    }

    if ($hostsNamesList.Count -gt 0) {
        
        # Add placeholder for new value at the end of the list
        $hostRecord = [EmptyRecord]::new();

        # Create placeholder for new records we didn't use yet
        $hostRecordPlaceholder = [HostRecord]::new();
        $hostRecordPlaceholder.Address = $Address;
        $hostRecordPlaceholder.Names = $hostsNamesList;

        $hostsList += $hostRecord, $hostRecordPlaceholder;
    }
    
    Write-Hosts -Records $hostsList;
}