# encoding: ascii
# api: powershell
# title: WhileTimeout
# description: Generic wrapper for the While statement that will execute a condition a given number of max tries, waiting a given number of seconds in between.
# version: 0.1
# type: function
# license: CC0
# x-poshcode-id: 609
# x-archived: 2008-09-29T01:24:59
#
# This example will execute the “IsItDoneYet” function (that checks a hypothetical external factor) once every 5 seconds, a total of no more than 24 times, which will take approximately two minutes, not including function execution time.
# > $condition = { IsItDoneYet }
# > WhileTimeout 5 24 $condition
#
function WhileTimeout ( [int]$interval, [int]$maxTries, [scriptblock]$condition )
{
	$i = 0
	$startTime = Get-Date
	while ( &$condition ) {
		$i++
		if ( $i -lt $maxTries ) {
			Start-Sleep -seconds $interval
		} else {
			Throw "Operation exceeded timeout"
		}
	}
	$endTime = Get-Date
	$duration = ( $endTime - $startTime ).TotalSeconds
	Write-Verbose "Operation elapsed time: $duration seconds"
}
