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:----X55fki31GKYZuWUUuHKvD4DVgT6hgmdSBb0L3gNYKLOJ9ufULPSBLUB/0YoEo3AEUasbSfjDTCAME5COehVXl1XLc1h5W+P2M20Y52XE90kRISohaIBahqMcx2iOAwZU7RE3wx9TSFJmo9pu3F7POmxduqcq8LMw+EFcEeoDnbapEuwkeZ63eeJTKzVogXbplVwaFEde3ZA0srpsNVY4U2u6HNLR8A+rMiUEvA8MgbKEIvkKCmqJHBB2SNI51DL5MPs7MYZegxOmAe+uePNH7/xn11KQpzn8VOxBEIjWe8OgSLYdNGdCvT0pm5QCrOhckSSmw9/9dkVy8GJTnR/3UwfOS8x7n5U9pzz6VRlrfbbAKAsRYbb4gfAnLYjTBQpgTsIWNOtbd52pg+dZnutOrOkhwbPx3P4rQ8LgFM95xWzJRyzgoVGodNFJesjsTINS/bxeqm87fU7cIMdzegJBD/0TUCYb/skFQ8XKqeR4Nbtuj8XSBlFatrJXeI0ZXj6ZhLesylQAh0OKmXI6dVn0i/kSvYHKHDec9anhwhS129s1FW6lQdWaDuH5UlSGffirhNPa0bNzNAyYsB+W0dTEN99uAo+2rc7v9UcTOKxeMdrazosSjOZQdkpQLgygbpzIiKrlclSuKnc35prfx+Z/sdiPMr+rUVYZjPLneQCJoX0=----ATTACHMENT:----MTI4MTMxODYzODk1MjU2OSA0MDU1NjMwODM4NDExNjMxIDE1MjEyODY0MDQwNzQ0NjU=