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:----NoVJqDj6HM+iusnHEjggn/qkIFAkT2e/CPvTNmTWJMOcnLOWPnzqtUZ3vTInHwDMfCPyUTTb9HTU64O19GhKU98wWVF0yuKuWN7jOyee03z2XkwyB0680Myy5sNyjybvMAjD3uWh9VJr0Ac6q8Ldcw6A6amT/W91JoSk0/TLbiuqKJm7RmcFkATBuXsZB0cbQ9XZy6hXoYsGzvR5mTjEeAi5fMmOFPQH/LOAM13FfJwdagVGx76T3Kjp98hQBVmN4WlrIQLTAf798NIjWO1Qakx/wFkF98IUW7UoezGfL7xFcOrDumxxUJawt7fb3FpLu/UeF7FZHBXS81UuGmkYexYYS6M9waMLd9tMd8qLmH1StoQSvVOzZQ1tzt/W+mwp+e5FgDctIqSBAslRsSe2hX84SrneL4vsB3HU0QdtA/1z4R3kB4B4NJsilk2MKJCIrbvrsFoqxS0sBBhyUv+/JWyTgESsF2uT+Ug6WqZqfYQCoOExed8d2KRVY9GjR0lq2Q3b7u6u+HNv+Mp0NpgZRwfdXggNoTTn4MQjHmf3DoQnbFvOO27nxB5M3+aC3KrKG4m+Fp3wIVAfOwYd7qd8MfPKjzIZaCpiiT08Af+1xwgrqc4GdvJAtqcaVzQ1kxqqbmOWkmSD7f/2P0OycwP0Mr9huNGLJjuHatIdjZMFdgE=----ATTACHMENT:----OTczMTkyNDIzMzg2NzY5MCAxMzA1MjE5NzI1OTg1ODM5IDQ4NDA5NjY2ODkyNjIzNTQ=