# encoding: ascii
# api: powershell
# title: gather/take
# description: Port of Perl 6’s gather/take (which itself is a port of Mathematica’s Reap/Sow)
# version: 0.1
# type: function
# author: Public Domain
# license: CC0
# x-poshcode-id: 5119
# x-archived: 2014-05-02T00:17:21
# x-published: 2014-04-26T23:37:00
#
#
function gather {
#.SYNOPSIS
# Port of Perl 6's gather/take (which itself is a port of Mathematica's Reap/Sow)
#.EXAMPLE
# gather { 1 ; take 2 ; 3 ; take 4 5 }
# 2
# 4
# 5
#.NOTES
# PowerShell doesn't really need this since the pipeline does this by default
# (and does a much better job since it works by using a push streaming model)
# but it's useful in the rare cases that it's necessary.
[CmdletBinding()]
param(
[Parameter(Mandatory)]
[scriptblock]$Script
)
try {
${function:take} = (New-Object System.Management.Automation.PSModuleInfo $true).NewBoundScriptBlock({ $script:acc.AddRange($args) })
& ${function:take}.Module { $script:acc = [System.Collections.ArrayList]@() }
} catch {
throw
}
$null = & $Script
& ${function:take}.Module { $script:acc }
}