Syntax: where (predicate {(v, k) ==> result})
public function where($predicate) { $predicate = Utils::createLambda($predicate, 'v,k'); return new self(function () use($predicate) { foreach ($this as $k => $v) { if ($predicate($v, $k)) { (yield $k => $v); } } }); }