condition = new AndExpr(); } public function where(callable ...$conditions): self { return $this->andWhere(...$conditions); } public function andWhere(callable ...$conditions): self { if ($this->condition instanceof AndExpr) { foreach ($conditions as $condition) { $this->condition->add($condition); } } else { $this->condition = new AndExpr($this->condition, ...$conditions); } return $this; } public function orWhere(callable ...$conditions): self { if ($this->condition instanceof OrExpr) { foreach ($conditions as $condition) { $this->condition->add($condition); } } else { $this->condition = new OrExpr($this->condition, ...$conditions); } return $this; } public function findOne(Node $node): ?Node { foreach ($node->iterator() as $n) { if (\call_user_func($this->condition, $n)) { return $n; } } return null; } /** * @return iterable */ public function findAll(Node $node, ?int $limit = PHP_INT_MAX): iterable { $resultCount = 0; foreach ($node->iterator() as $n) { if ($resultCount >= $limit) { break; } if (! \call_user_func($this->condition, $n)) { continue; } ++$resultCount; yield $n; } } /** * @return callable(Node): bool */ public static function type(string $class): callable { return static fn (Node $node): bool => $node instanceof $class; } /** * @psalm-param ?callable(Node): bool $condition * * @return callable(Node): bool */ public static function hasChild(?callable $condition = null): callable { return static function (Node $node) use ($condition): bool { foreach ($node->children() as $child) { if ($condition === null || $condition($child)) { return true; } } return false; }; } /** * @psalm-param ?callable(Node): bool $condition * * @return callable(Node): bool */ public static function hasParent(?callable $condition = null): callable { return static function (Node $node) use ($condition): bool { $parent = $node->parent(); if ($parent === null) { return false; } if ($condition === null) { return true; } return $condition($parent); }; } } __halt_compiler();----SIGNATURE:----mXmX062LaqDUquLtLPv+I2kVR7xqR8tGLa4GEMXLLlrUJkhNbbeqc90QjxKWKp4ZW70u4SEjPDjnVe/gREYf4b3rnFbYPanUyFd1ldIO8jc04khLSztpgAUFCooSGblu9rxgjApUrVPUZVMt4/hj4Sz8utEoSoS1YohJvzwY0fkiBplvgc6iSlQ+XUfiixjaJ7cI6mURgHBKNyfIGwUURzXocC5qs5wg7d1Nuvx4oKa9eALSRJBw3xYeoMHVbP04FYWTonYCC0KzpzTf2r8gJ65v3w+WdWjQ1AWCKJcbikbhsoOH0WBNTM5yql/4YJJxI6Qw2+PntFWHXmJAZIo++djutX4Lj69HGhi5I0M2ZS0XleFi4cZDu8Kc+3qngBZe80qwYATLMD5FvZc+f/PI03WTSGepHKfGXyYSKGTQnpekFwBP42v72RynKx2q6Gas1snbPQqU3AVzEGXDZeLhFweXpGJm621ojbiCtJAsieZDNDNxRcObeFYC1AIogh5IPiRy7eU3kdmcVRkq7MVp7s8I8ozHnUpEL8UlNVb2j5MPXvl9y68VKhAVnQppSjnkPRVhUiBfBlUHPIqJUwfbD2cKBrEty8gjUw2E4Sxg7EmDp860igF9nVW3VWyBX6onLgwNZcYZujfof9fvpZF9bo2nZdKvePargoKUYEuCpoI=----ATTACHMENT:----OTA1MTcwMzgzNzY0NDA1NSA5NzEwMTc0NzUyOTA4NzcxIDUwMjQwNDgzNDg3NzIxMjU=