Src/Private/PSGraph/Rank.ps1
|
function Rank { <# .Description Places specified nodes at the same level on the chart as a way to give some guidance to node layout .Example graph g { rank 1,3,5,7 rank 2,4,6,8 edge (1..8) } .Example $odd = @(1,3,5,7) $even = @(2,4,6,8) graph g { rank $odd rank $even edge $odd -to $even } .Notes Accepts an array of items or a list of strings. #> [cmdletbinding()] param( # List of nodes to be on the same level as each other [Parameter( Mandatory = $true, ValueFromPipeline = $true, Position = 0 )] [object[]] $Nodes, # Used to catch alternate style of specifying nodes [Parameter( ValueFromRemainingArguments = $true, Position = 1 )] [object[]] $AdditionalNodes, # Script to run on each node [alias('Script')] [scriptblock] $NodeScript = {$_} ) begin { $values = @() } process { try { $itemList = New-Object System.Collections.Queue if ( $null -ne $Nodes ) { $Nodes | ForEach-Object {$_} | ForEach-Object {$itemList.Enqueue($_)} } if ( $null -ne $AdditionalNodes ) { $AdditionalNodes | ForEach-Object {$_} | ForEach-Object {$_} | ForEach-Object {$itemList.Enqueue($_)} } $Values += foreach ($item in $itemList) { # Adding these arrays creates an empty element that we want to exclude if ( -Not [string]::IsNullOrWhiteSpace( $item ) ) { if ( $NodeScript ) { $nodeName = [string]( @( $item ).ForEach( $NodeScript ) ) } else { $nodeName = $item } Format-Value $nodeName -Node } } } catch { $PSCmdlet.ThrowTerminatingError( $PSitem ) } } end { '{0}{{ rank=same; {1}; }}' -f (Get-Indent), ($values -join '; ') } } |