Private/Get-Koan.ps1

using namespace System.Text

function Get-Koan {
    <#
    .SYNOPSIS
        Returns a sorted list of koans.

    .DESCRIPTION
        Returns a sorted list of all koans, or optionally only those that match the specified criteria.

    .PARAMETER Topic
        Speficy one or more topic names or patterns to filter the list. Regex matching is permitted.

    .EXAMPLE
        Get-Koan

        Returns all koans in the PSKoans library folder.
    #>


    [CmdletBinding()]
    [OutputType([System.IO.FileInfo])]
    param(
        [Parameter(Position = 0, ValueFromPipeline)]
        [string[]]
        $Topic
    )
    begin {
        if ($PSBoundParameters.ContainsKey('Topic')) {
            $PatternBuilder = [StringBuilder]::new()
        }
    }
    process {
        if ($PSBoundParameters.ContainsKey('Topic')) {
            foreach ($Item in $Topic) {
                if ($PatternBuilder.Length -gt 0) {
                    $PatternBuilder.AppendFormat('|{0}', $Item) > $null
                }
                else {
                    $PatternBuilder.Append($Item) > $null
                }
            }
        }
    }
    end {
        Get-ChildItem -Path (Get-PSKoanLocation) -Recurse -Filter '*.Koans.ps1' |
            Where-Object { -not $PSBoundParameters.ContainsKey('Topic') -or $_.BaseName -match $PatternBuilder.ToString() } |
            Get-Command { $_.FullName } |
            Where-Object { $_.ScriptBlock.Attributes.Where{ $_.TypeID -match 'Koan' }.Count -gt 0 } |
            Sort-Object { $_.ScriptBlock.Attributes.Where{ $_.TypeID -match 'Koan' }.Position }
    }
}