# encoding: ascii
# api: powershell
# title: where-in
# description: where-in and where-propertyin are filters that allow to pass through pipeline object that are in a specified array/collection, or that have a property that is in an array or collection. They also can take a scriptblock that can be used to implement a comparision when the relationship isn’t exact. in that scriptblock the variable $__ is created to represent the item in the collection being compared with the pipeline $_ object. see examples embedded.
# version: 0.1
# type: function
# author: karl prosser
# license: CC0
# function: where-in
# x-poshcode-id: 2512
# x-archived: 2015-11-09T13:22:23
# x-published: 2011-02-17T21:47:00
#
#
function where-in {
[cmdletbinding()]
param (
[parameter(mandatory = $true,position = 1)]
[system.Collections.IEnumerable]$collection,
[parameter(position = 2)]
[scriptblock]$predicate ,
[parameter(valuefrompipeline = $true)]
$pipelineobject
)
    process {
        if ($predicate) {
            foreach ($__ in $collection) {
                if(&$predicate) { 
                    write-Output $pipelineobject
                    break;
                }
            }
        }
        else {        
            if ($collection -contains $pipelineobject) {
            write-Output $pipelineobject }
        }
    }
}
set-alias ?in where-in

$a = (1..10) , (1..10) | % { $_ }
$a | Where-in (3,4,8)


gps | where-in  ("power","s")  { $_.processname.startswith($__) }

function where-propertyin {
[cmdletbinding()]
param (
[parameter(mandatory = $true,position = 1)]
[system.Collections.IEnumerable]$collection,
[parameter(mandatory = $true,position = 2)]
[string] $propertyname,
[parameter(position = 3)]
[scriptblock]$predicate ,
[parameter(valuefrompipeline = $true)]
$pipelineobject
)
    process {
        if ($predicate) {
            foreach ($__ in $collection) {
                $_ = $pipelineobject.$propertyname
                if(&$predicate) { 
                    write-Output $pipelineobject
                    break;
                }
            }
        }
        else {        
            if ($collection -contains $pipelineobject.$propertyname) {
            write-Output $pipelineobject }
        }
    }
}
set-alias ?.in where-propertyin

gps | where-propertyin ("powershell","svchost") processname 
gps | where-propertyin ("power","s") processname { $_.startswith($__) }
