[
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\ncharset=utf-8\nend_of_line=lf\ntrim_trailing_whitespace=true\ninsert_final_newline=true\nindent_style=space\nindent_size=4\n\n[*.{yaml,yml}]\nindent_size=2\n"
  },
  {
    "path": ".gitattributes",
    "content": "/.gitattributes       export-ignore\n/.gitignore           export-ignore\n/.github              export-ignore\n/.php-cs-fixer.php    export-ignore\n/.editorconfig        export-ignore\n/psalm.xml            export-ignore\n/bin                  export-ignore\n/ci                   export-ignore\n/phpunit.xml.dist     export-ignore\n/tests                export-ignore\n/tools                export-ignore\n"
  },
  {
    "path": ".github/workflows/ci.yaml",
    "content": "# https://docs.github.com/en/actions\n\nname: CI\n\non:\n  pull_request: ~\n  push:\n    branches:\n      - master\n\njobs:\n\n  static-code-analysis:\n    name: Static Code Analysis\n\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n\n      - name: Install PHP\n        uses: shivammathur/setup-php@v2\n        with:\n          php-version: '8.4'\n          coverage: none\n          extensions: mbstring\n\n      - name: Install dependencies\n        run: >-\n          composer install\n\n      - name: Install tools\n        run: >-\n          composer run install-tools\n\n      - name: Run code style check\n        run: >-\n          composer run cs-check\n\n      - name: Run static analysis\n        run: >-\n          composer run static-analysis\n\n     # Disabled for version 2.0, since there is no BC promise at this time.\n     # - name: Run backwards compatibility check\n     #   run: >-\n     #     composer run bc-check\n\n  tests:\n    name: Tests\n\n    runs-on: ubuntu-latest\n\n    strategy:\n      matrix:\n        php-version:\n          - \"8.2\"\n          - \"8.3\"\n          - \"8.4\"\n          - \"8.5\"\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Install PHP\n        uses: shivammathur/setup-php@v2\n        with:\n          php-version: \"${{ matrix.php-version }}\"\n          coverage: none\n          extensions: mbstring\n\n      - name: Install dependencies\n        run: >-\n          composer install\n\n      - name: Install phpunit\n        run: >-\n          composer --working-dir=tools/phpunit install\n\n      - name: Run tests\n        run: >-\n          composer run test\n\n  windows-tests:\n    name: Windows tests\n\n    runs-on: windows-latest\n\n    strategy:\n      matrix:\n        php-version:\n          - \"8.2\"\n          - \"8.3\"\n          - \"8.4\"\n          - \"8.5\"\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Install PHP\n        uses: shivammathur/setup-php@v2\n        with:\n          php-version: \"${{ matrix.php-version }}\"\n          coverage: none\n          extensions: mbstring\n\n      - name: Install dependencies\n        run: >-\n          composer install\n\n      - name: Install phpunit\n        run: >-\n          composer --working-dir=tools/phpunit install\n\n      - name: Run tests\n        run: >-\n          composer run test\n"
  },
  {
    "path": ".gitignore",
    "content": "vendor/\n/composer.lock\n.php-cs-fixer.cache\n.phpunit.result.cache\n"
  },
  {
    "path": ".php-cs-fixer.php",
    "content": "<?php\n\n$finder = PhpCsFixer\\Finder::create()\n    ->in(__DIR__.'/src')\n    ->in(__DIR__.'/tests')\n;\n\nreturn (new PhpCsFixer\\Config())\n    ->setRiskyAllowed(true)\n    ->setRules([\n        '@PSR2' => true,\n        '@Symfony' => true,\n        'ordered_imports' => true,\n        'array_syntax' => ['syntax' => 'short'],\n        'fully_qualified_strict_types' => false,\n        'global_namespace_import' => true,\n        'no_superfluous_phpdoc_tags' => false,\n        'phpdoc_annotation_without_dot' => false,\n        'phpdoc_types_order' => false,\n        'phpdoc_separation' => ['skip_unlisted_annotations' => true],\n        'phpdoc_summary' => false,\n        'phpdoc_to_comment' => false,\n        'phpdoc_align' => false,\n        'yoda_style' => false,\n    ])\n    ->setFinder($finder)\n;\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "Changelog\n=========\n\n## 2.1.6\n\n### Fixed\n\n- Corrected docblocks for `list*` methods.\n\n## 2.1.5\n\n### Fixed\n\n- Fixed regression of `instanceOf` messages\n\n## 2.1.4\n\n### Fixed\n\n- Use custom message for more internal calls.\n\n## 2.1.3\n\n### Fixed\n\n- Corrected `isList` type documentation.\n- Corrected `isAOf`, `isInstanceOf`, etc type documentation.\n\n## 2.1.2\n\n### Fixed\n\n- Changed `all*` assertion values back to `mixed`.\n\n## 2.1.1\n\n### Fixed\n\n- Optimized `stringNotEmpty` by internally using `notSame`.\n\n## 2.1.0\n\n### Fixed\n\n- Corrected `@param` declaration for `isMap`.\n- Pass custom message to internal assertion calls.\n\n## 2.0.0\n\n### Changed\n\n- **BREAKING** Minimum PHP version is now 8.2 (was 7.2).\n- **BREAKING** Remove deprecated `isTraversable`, use `isIterable` or `isInstanceOf` instead.\n- **BREAKING** Added `declare(strict_types=1)` to all classes.\n- Updated CI/CD test matrix to test PHP 8.2, 8.3, 8.4, and 8.5.\n- Updated development tools (PHPUnit, Psalm, PHP-CS-Fixer) to supported versions.\n- Added explicit return types and parameter types to all methods in both source code and tests.\n\n### Added\n\n- All assertion methods now return the checked value.\n- Added `notInArray` and `notOneOf`.\n- Added `isInitialized`, to check if a class property is initialized.\n- Added `negativeInteger` and `notNegativeInteger`\n- Added `isStatic` and `notStatic`\n\n### Fixed\n\n- Corrected validation of emails with unicode characters.\n\n## 1.12.1\n\n### Fixed\n\n- Exclude tools from export.\n\n## 1.12.0\n\n### Fixed\n\n- Corrected messages and typos in various assertions.\n- Document `void` return type.\n- Prevent UUIDs with trailing newlines from validating.\n- Assert values are strings before ctype checks.\n\n## 1.11.0\n\n### Added\n\n* Added explicit (non-magic) `allNullOr*` methods, with `@psalm-assert` annotations, for better Psalm support.\n\n### Changed\n\n* Trait methods will now check the assertion themselves, instead of using `__callStatic`\n* `isList` will now deal correctly with (modified) lists that contain `NaN`\n* `reportInvalidArgument` now has a return type of `never`.\n\n### Removed\n\n* Removed `symfony/polyfill-ctype` as a dependency, and require `ext-ctype` instead.\n  * You can still require the `symfony/polyfill-ctype` in your project if you need it, as it provides `ext-ctype`\n\n## 1.10.0\n\n### Added\n\n* On invalid assertion, we throw a `Webmozart\\Assert\\InvalidArgumentException`\n* Added `Assert::positiveInteger()`\n\n### Changed\n\n* Using a trait with real implementations of `all*()` and `nullOr*()` methods to improve psalm compatibility.\n\n### Removed\n\n* Support for PHP <7.2\n\n## 1.9.1\n\n## Fixed\n\n* provisional support for PHP 8.0\n\n## 1.9.0\n\n* added better Psalm support for `all*` & `nullOr*` methods\n* These methods are now understood by Psalm through a mixin. You may need a newer version of Psalm in order to use this\n* added `@psalm-pure` annotation to `Assert::notFalse()`\n* added more `@psalm-assert` annotations where appropriate\n\n## Changed\n\n* the `all*` & `nullOr*` methods are now declared on an interface, instead of `@method` annotations.\nThis interface is linked to the `Assert` class with a `@mixin` annotation. Most IDEs have supported this\nfor a long time, and you should not lose any autocompletion capabilities. PHPStan has supported this since\nversion `0.12.20`. This package is marked incompatible (with a composer conflict) with phpstan version prior to that.\nIf you do not use PHPStan than this does not matter.\n\n## 1.8.0\n\n### Added\n\n* added `Assert::notStartsWith()`\n* added `Assert::notEndsWith()`\n* added `Assert::inArray()`\n* added `@psalm-pure` annotations to pure assertions\n\n### Fixed\n\n* Exception messages of comparisons between `DateTime(Immutable)` objects now display their date & time.\n* Custom Exception messages for `Assert::count()` now use the values to render the exception message.\n\n## 1.7.0 (2020-02-14)\n\n### Added\n\n* added `Assert::notFalse()`\n* added `Assert::isAOf()`\n* added `Assert::isAnyOf()`\n* added `Assert::isNotA()`\n\n## 1.6.0 (2019-11-24)\n\n### Added\n\n* added `Assert::validArrayKey()`\n* added `Assert::isNonEmptyList()`\n* added `Assert::isNonEmptyMap()`\n* added `@throws InvalidArgumentException` annotations to all methods that throw.\n* added `@psalm-assert` for the list type to the `isList` assertion.\n\n### Fixed\n\n* `ResourceBundle` & `SimpleXMLElement` now pass the `isCountable` assertions.\nThey are countable, without implementing the `Countable` interface.\n* The doc block of `range` now has the proper variables.\n* An empty array will now pass `isList` and `isMap`. As it is a valid form of both.\nIf a non-empty variant is needed, use `isNonEmptyList` or `isNonEmptyMap`.\n\n### Changed\n\n* Removed some `@psalm-assert` annotations, that were 'side effect' assertions See:\n  * [#144](https://github.com/webmozart/assert/pull/144)\n  * [#145](https://github.com/webmozart/assert/issues/145)\n  * [#146](https://github.com/webmozart/assert/pull/146)\n  * [#150](https://github.com/webmozart/assert/pull/150)\n* If you use Psalm, the minimum version needed is `3.6.0`. Which is enforced through a composer conflict.\nIf you don't use Psalm, then this has no impact.\n\n## 1.5.0 (2019-08-24)\n\n### Added\n\n* added `Assert::uniqueValues()`\n* added `Assert::unicodeLetters()`\n* added: `Assert::email()`\n* added support for [Psalm](https://github.com/vimeo/psalm), by adding `@psalm-assert` annotations where appropriate.\n\n### Fixed\n\n* `Assert::endsWith()` would not give the correct result when dealing with a multibyte suffix.\n* `Assert::length(), minLength, maxLength, lengthBetween` would not give the correct result when dealing with multibyte characters.\n\n**NOTE**: These 2 changes may break your assertions if you relied on the fact that multibyte characters didn't behave correctly.\n\n### Changed\n\n* The names of some variables have been updated to better reflect what they are.\n* All function calls are now in their FQN form, slightly increasing performance.\n* Tests are now properly ran against HHVM-3.30 and PHP nightly.\n\n### Deprecation\n\n* deprecated `Assert::isTraversable()` in favor of `Assert::isIterable()`\n  * This was already done in 1.3.0, but it was only done through a silenced `trigger_error`. It is now annotated as well.\n\n## 1.4.0 (2018-12-25)\n\n### Added\n\n* added `Assert::ip()`\n* added `Assert::ipv4()`\n* added `Assert::ipv6()`\n* added `Assert::notRegex()`\n* added `Assert::interfaceExists()`\n* added `Assert::isList()`\n* added `Assert::isMap()`\n* added polyfill for ctype\n\n### Fixed\n\n* Special case when comparing objects implementing `__toString()`\n\n## 1.3.0 (2018-01-29)\n\n### Added\n\n* added `Assert::minCount()`\n* added `Assert::maxCount()`\n* added `Assert::countBetween()`\n* added `Assert::isCountable()`\n* added `Assert::notWhitespaceOnly()`\n* added `Assert::natural()`\n* added `Assert::notContains()`\n* added `Assert::isArrayAccessible()`\n* added `Assert::isInstanceOfAny()`\n* added `Assert::isIterable()`\n\n### Fixed\n\n* `stringNotEmpty` will no longer report \"0\" is an empty string\n\n### Deprecation\n\n* deprecated `Assert::isTraversable()` in favor of `Assert::isIterable()`\n\n## 1.2.0 (2016-11-23)\n\n * added `Assert::throws()`\n * added `Assert::count()`\n * added extension point `Assert::reportInvalidArgument()` for custom subclasses\n\n## 1.1.0 (2016-08-09)\n\n * added `Assert::object()`\n * added `Assert::propertyExists()`\n * added `Assert::propertyNotExists()`\n * added `Assert::methodExists()`\n * added `Assert::methodNotExists()`\n * added `Assert::uuid()`\n\n## 1.0.2 (2015-08-24)\n\n * integrated Style CI\n * add tests for minimum package dependencies on Travis CI\n\n## 1.0.1 (2015-05-12)\n\n * added support for PHP 5.3.3\n\n## 1.0.0 (2015-05-12)\n\n * first stable release\n\n## 1.0.0-beta (2015-03-19)\n\n * first beta release\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Bernhard Schussek\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "Webmozart Assert\n================\n\n[![Latest Stable Version](https://poser.pugx.org/webmozart/assert/v/stable.svg)](https://packagist.org/packages/webmozart/assert)\n[![Total Downloads](https://poser.pugx.org/webmozart/assert/downloads.svg)](https://packagist.org/packages/webmozart/assert)\n\nThis library contains efficient assertions to test the input and output of\nyour methods. With these assertions, you can greatly reduce the amount of coding\nneeded to write a safe implementation.\n\nAll assertions in the [`Assert`] class throw an `Webmozart\\Assert\\InvalidArgumentException` if\nthey fail.\n\nFAQ\n---\n\n**What's the difference to [beberlei/assert]?**\n\nThis library is heavily inspired by Benjamin Eberlei's wonderful [assert package],\nbut fixes a usability issue with error messages that can't be fixed there without\nbreaking backwards compatibility.\n\nThis package features usable error messages by default. However, you can also\neasily write custom error messages:\n\n```\nAssert::string($path, 'The path is expected to be a string. Got: %s');\n```\n\nIn [beberlei/assert], the ordering of the `%s` placeholders is different for\nevery assertion. This package, on the contrary, provides consistent placeholder\nordering for all assertions:\n\n* `%s`: The tested value as string, e.g. `\"/foo/bar\"`.\n* `%2$s`, `%3$s`, ...: Additional assertion-specific values, e.g. the\n  minimum/maximum length, allowed values, etc.\n\nCheck the source code of the assertions to find out details about the additional\navailable placeholders.\n\nInstallation\n------------\n\nUse [Composer] to install the package:\n\n```bash\ncomposer require webmozart/assert\n```\n\nExample\n-------\n\n```php\nuse Webmozart\\Assert\\Assert;\n\nclass Employee\n{\n    public function __construct($id)\n    {\n        Assert::integer($id, 'The employee ID must be an integer. Got: %s');\n        Assert::greaterThan($id, 0, 'The employee ID must be a positive integer. Got: %s');\n    }\n}\n```\n\nIf you create an employee with an invalid ID, an exception is thrown:\n\n```php\nnew Employee('foobar');\n// => Webmozart\\Assert\\InvalidArgumentException:\n//    The employee ID must be an integer. Got: string\n\nnew Employee(-10);\n// => Webmozart\\Assert\\InvalidArgumentException:\n//    The employee ID must be a positive integer. Got: -10\n```\n\nAssertions\n----------\n\nThe [`Assert`] class provides the following assertions:\n\n### Type Assertions\n\nMethod                                                   | Description\n-------------------------------------------------------- | --------------------------------------------------\n`string($value, $message = '')`                          | Check that a value is a string\n`stringNotEmpty($value, $message = '')`                  | Check that a value is a non-empty string\n`integer($value, $message = '')`                         | Check that a value is an integer\n`integerish($value, $message = '')`                      | Check that a value casts to an integer\n`positiveInteger($value, $message = '')`                 | Check that a value is a positive (non-zero) integer\n`negativeInteger($value, $message = '')`                 | Check that a value is a negative integer\n`notNegativeInteger($value, $message = '')`              | Check that a value is a non-negative integer\n`float($value, $message = '')`                           | Check that a value is a float\n`numeric($value, $message = '')`                         | Check that a value is numeric\n`natural($value, $message = '')`                         | Check that a value is a non-negative integer\n`boolean($value, $message = '')`                         | Check that a value is a boolean\n`scalar($value, $message = '')`                          | Check that a value is a scalar\n`object($value, $message = '')`                          | Check that a value is an object\n`objectish($value, $message = '')`                       | Check that a value is an object or a string of a class that exists\n`resource($value, $type = null, $message = '')`          | Check that a value is a resource\n`isInitialized($value, $property, $message = '')`        | Check that a value has an initialized property\n`isCallable($value, $message = '')`                      | Check that a value is a callable\n`isArray($value, $message = '')`                         | Check that a value is an array\n`isIterable($value, $message = '')`                      | Check that a value is an array or a `\\Traversable`\n`isCountable($value, $message = '')`                     | Check that a value is an array or a `\\Countable`\n`isInstanceOf($value, $class, $message = '')`            | Check that a value is an `instanceof` a class\n`isInstanceOfAny($value, array $classes, $message = '')` | Check that a value is an `instanceof` at least one class on the array of classes\n`notInstanceOf($value, $class, $message = '')`           | Check that a value is not an `instanceof` a class\n`isAOf($value, $class, $message = '')`                   | Check that a value is of the class or has one of its parents\n`isAnyOf($value, array $classes, $message = '')`         | Check that a value is of at least one of the classes or has one of its parents\n`isNotA($value, $class, $message = '')`                  | Check that a value is not of the class or has not one of its parents\n`isArrayAccessible($value, $message = '')`               | Check that a value can be accessed as an array\n`uniqueValues($values, $message = '')`                   | Check that the given array contains unique values\n\n### Comparison Assertions\n\nMethod                                                | Description\n----------------------------------------------------- | ------------------------------------------------------------------\n`true($value, $message = '')`                         | Check that a value is `true`\n`false($value, $message = '')`                        | Check that a value is `false`\n`notFalse($value, $message = '')`                     | Check that a value is not `false`\n`null($value, $message = '')`                         | Check that a value is `null`\n`notNull($value, $message = '')`                      | Check that a value is not `null`\n`isEmpty($value, $message = '')`                      | Check that a value is `empty()`\n`notEmpty($value, $message = '')`                     | Check that a value is not `empty()`\n`eq($value, $value2, $message = '')`                  | Check that a value equals another (`==`)\n`notEq($value, $value2, $message = '')`               | Check that a value does not equal another (`!=`)\n`same($value, $value2, $message = '')`                | Check that a value is identical to another (`===`)\n`notSame($value, $value2, $message = '')`             | Check that a value is not identical to another (`!==`)\n`greaterThan($value, $value2, $message = '')`         | Check that a value is greater than another\n`greaterThanEq($value, $value2, $message = '')`       | Check that a value is greater than or equal to another\n`lessThan($value, $value2, $message = '')`            | Check that a value is less than another\n`lessThanEq($value, $value2, $message = '')`          | Check that a value is less than or equal to another\n`range($value, $min, $max, $message = '')`            | Check that a value is within a range\n`inArray($value, array $values, $message = '')`       | Check that a value is one of a list of values\n`notInArray($value, array $values, $message = '')`    | Check that a value is not one of a list of values\n`oneOf($value, array $values, $message = '')`         | Check that a value is one of a list of values (alias of `inArray`)\n`notOneOf($value, array $values, $message = '')`      | Check that a value is not one of a list of values (alias of `notInArray`)\n\n### String Assertions\n\nYou should check that a value is a string with `Assert::string()` before making\nany of the following assertions.\n\nMethod                                              | Description\n--------------------------------------------------- | -----------------------------------------------------------------\n`contains($value, $subString, $message = '')`       | Check that a string contains a substring\n`notContains($value, $subString, $message = '')`    | Check that a string does not contain a substring\n`startsWith($value, $prefix, $message = '')`        | Check that a string has a prefix\n`notStartsWith($value, $prefix, $message = '')`     | Check that a string does not have a prefix\n`startsWithLetter($value, $message = '')`           | Check that a string starts with a letter\n`endsWith($value, $suffix, $message = '')`          | Check that a string has a suffix\n`notEndsWith($value, $suffix, $message = '')`       | Check that a string does not have a suffix\n`regex($value, $pattern, $message = '')`            | Check that a string matches a regular expression\n`notRegex($value, $pattern, $message = '')`         | Check that a string does not match a regular expression\n`unicodeLetters($value, $message = '')`             | Check that a string contains Unicode letters only\n`alpha($value, $message = '')`                      | Check that a string contains letters only\n`digits($value, $message = '')`                     | Check that a string contains digits only\n`alnum($value, $message = '')`                      | Check that a string contains letters and digits only\n`lower($value, $message = '')`                      | Check that a string contains lowercase characters only\n`upper($value, $message = '')`                      | Check that a string contains uppercase characters only\n`length($value, $length, $message = '')`            | Check that a string has a certain number of characters\n`minLength($value, $min, $message = '')`            | Check that a string has at least a certain number of characters\n`maxLength($value, $max, $message = '')`            | Check that a string has at most a certain number of characters\n`lengthBetween($value, $min, $max, $message = '')`  | Check that a string has a length in the given range\n`uuid($value, $message = '')`                       | Check that a string is a valid UUID\n`ip($value, $message = '')`                         | Check that a string is a valid IP (either IPv4 or IPv6)\n`ipv4($value, $message = '')`                       | Check that a string is a valid IPv4\n`ipv6($value, $message = '')`                       | Check that a string is a valid IPv6\n`email($value, $message = '')`                      | Check that a string is a valid e-mail address\n`notWhitespaceOnly($value, $message = '')`          | Check that a string contains at least one non-whitespace character\n\n### File Assertions\n\nMethod                              | Description\n----------------------------------- | --------------------------------------------------\n`fileExists($value, $message = '')` | Check that a value is an existing path\n`file($value, $message = '')`       | Check that a value is an existing file\n`directory($value, $message = '')`  | Check that a value is an existing directory\n`readable($value, $message = '')`   | Check that a value is a readable path\n`writable($value, $message = '')`   | Check that a value is a writable path\n\n### Object Assertions\n\nMethod                                                | Description\n----------------------------------------------------- | --------------------------------------------------\n`classExists($value, $message = '')`                  | Check that a value is an existing class name\n`subclassOf($value, $class, $message = '')`           | Check that a class is a subclass of another\n`interfaceExists($value, $message = '')`              | Check that a value is an existing interface name\n`implementsInterface($value, $class, $message = '')`  | Check that a class implements an interface\n`propertyExists($value, $property, $message = '')`    | Check that a property exists in a class/object\n`propertyNotExists($value, $property, $message = '')` | Check that a property does not exist in a class/object\n`methodExists($value, $method, $message = '')`        | Check that a method exists in a class/object\n`methodNotExists($value, $method, $message = '')`     | Check that a method does not exist in a class/object\n\n### Array Assertions\n\nMethod                                             | Description\n-------------------------------------------------- | ------------------------------------------------------------------\n`keyExists($array, $key, $message = '')`           | Check that a key exists in an array\n`keyNotExists($array, $key, $message = '')`        | Check that a key does not exist in an array\n`validArrayKey($key, $message = '')`               | Check that a value is a valid array key (int or string)\n`count($array, $number, $message = '')`            | Check that an array contains a specific number of elements\n`minCount($array, $min, $message = '')`            | Check that an array contains at least a certain number of elements\n`maxCount($array, $max, $message = '')`            | Check that an array contains at most a certain number of elements\n`countBetween($array, $min, $max, $message = '')`  | Check that an array has a count in the given range\n`isList($array, $message = '')`                    | Check that an array is a non-associative list\n`isNonEmptyList($array, $message = '')`            | Check that an array is a non-associative list, and not empty\n`isMap($array, $message = '')`                     | Check that an array is associative and has strings as keys\n`isNonEmptyMap($array, $message = '')`             | Check that an array is associative and has strings as keys, and is not empty\n\n### Function Assertions\n\nMethod                                    | Description\n------------------------------------------| -----------------------------------------------------------------------------------------------------\n`throws($closure, $class, $message = '')` | Check that a function throws a certain exception. Subclasses of the exception class will be accepted.\n`isStatic($closure, $message = '')`       | Check that a function is static.\n`notStatic($closure, $message = '')`    | Check that a function is not static.\n\n### Collection Assertions\n\nAll of the above assertions can be prefixed with `all*()` to test the contents\nof an array or a `\\Traversable`:\n\n```php\nAssert::allIsInstanceOf($employees, 'Acme\\Employee');\n```\n\n### Nullable Assertions\n\nAll of the above assertions can be prefixed with `nullOr*()` to run the\nassertion only if the value is not `null`:\n\n```php\nAssert::nullOrString($middleName, 'The middle name must be a string or null. Got: %s');\n```\n\n### Extending Assert\n\nThe `Assert` class comes with a few methods, which can be overridden to change the class behaviour. You can also extend it to\nadd your own assertions.\n\n#### Overriding methods\n\nOverriding the following methods in your assertion class allows you to change the behaviour of the assertions:\n\n* `public static function __callStatic($name, $arguments)`\n  * This method is used to 'create' the `nullOr` and `all` versions of the assertions.\n* `protected static function valueToString($value)`\n  * This method is used for error messages, to convert the value to a string value for displaying. You could use this for representing a value object with a `__toString` method for example.\n* `protected static function typeToString($value)`\n  * This method is used for error messages, to convert a value to a string representing its type.\n* `protected static function strlen($value)`\n  * This method is used to calculate string length for relevant methods, using the `mb_strlen` if available and useful.\n* `protected static function reportInvalidArgument($message)`\n  * This method is called when an assertion fails, with the specified error message. Here you can throw your own exception, or log something.\n\n## Static analysis support\n\nWhere applicable, assertion functions are annotated to support Psalm's\n[Assertion syntax](https://psalm.dev/docs/annotating_code/assertion_syntax/).\nA dedicated [PHPStan Plugin](https://github.com/phpstan/phpstan-webmozart-assert) is\nrequired for proper type support.\n\nAuthors\n-------\n\n* [Bernhard Schussek] a.k.a. [@webmozart]\n* [The Community Contributors]\n\nContribute\n----------\n\nContributions to the package are always welcome!\n\n* Report any bugs or issues you find on the [issue tracker].\n* You can grab the source code at the package's [Git repository].\n\nLicense\n-------\n\nAll contents of this package are licensed under the [MIT license].\n\n[beberlei/assert]: https://github.com/beberlei/assert\n[assert package]: https://github.com/beberlei/assert\n[Composer]: https://getcomposer.org\n[Bernhard Schussek]: https://webmozarts.com\n[The Community Contributors]: https://github.com/webmozart/assert/graphs/contributors\n[issue tracker]: https://github.com/webmozart/assert/issues\n[Git repository]: https://github.com/webmozart/assert\n[@webmozart]: https://twitter.com/webmozart\n[MIT license]: LICENSE\n[`Assert`]: src/Assert.php\n"
  },
  {
    "path": "bin/generate.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/**\n * this file is used by maintainers of the library to re-generate the type definitions\n * of webmozart/assert: you probably don't need to use it.\n */\n\nuse Webmozart\\Assert\\Bin\\MixinGenerator;\n\nrequire_once __DIR__.'/../vendor/autoload.php';\n\nfile_put_contents(__DIR__.'/../src/Mixin.php', (new MixinGenerator())->generate());\n\necho \"Done.\";\n"
  },
  {
    "path": "bin/src/MixinGenerator.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Bin;\n\nuse ArrayAccess;\nuse Countable;\nuse ReflectionClass;\nuse ReflectionException;\nuse ReflectionIntersectionType;\nuse ReflectionMethod;\nuse ReflectionNamedType;\nuse ReflectionType;\nuse ReflectionUnionType;\nuse RuntimeException;\nuse Throwable;\nuse Webmozart\\Assert\\Assert;\n\nfinal class MixinGenerator\n{\n    /**\n     * @psalm-var list<string>\n     *\n     * @var string[]\n     */\n    private array $unsupportedMethods = [\n        'nullOrNotInstanceOf',  // not supported by psalm (https://github.com/vimeo/psalm/issues/3443)\n        'allNotInstanceOf',     // not supported by psalm (https://github.com/vimeo/psalm/issues/3443)\n        'nullOrNotEmpty',       // not supported by psalm (https://github.com/vimeo/psalm/issues/3443)\n        'allNotEmpty',          // not supported by psalm (https://github.com/vimeo/psalm/issues/3443)\n        'allNotNull',           // not supported by psalm (https://github.com/vimeo/psalm/issues/3443)\n        'nullOrIsNotA',         // not supported by psalm (https://github.com/vimeo/psalm/issues/3444)\n        'allIsNotA',            // not supported by psalm (https://github.com/vimeo/psalm/issues/3444)\n        'nullOrNotFalse',       // not supported by psalm (https://github.com/vimeo/psalm/issues/3443)\n        'allNotFalse',          // not supported by psalm (https://github.com/vimeo/psalm/issues/3443)\n        'nullOrUpper',          // not supported by psalm (https://github.com/vimeo/psalm/issues/3443)\n        'allUpper',             // not supported by psalm (https://github.com/vimeo/psalm/issues/3443)\n        'nullOrIsNonEmptyMap',  // not supported by psalm (https://github.com/vimeo/psalm/issues/3444)\n        'allIsNonEmptyMap',     // not supported by psalm (https://github.com/vimeo/psalm/issues/3444)\n    ];\n\n    private array $skipGenerateForMethods = [\n        'isInitialized',\n    ];\n\n    /**\n     * @psalm-var list<string>\n     *\n     * @var string[]\n     */\n    private array $skipMethods = [\n        'nullOrNull',           // meaningless\n        'nullOrNotNull',        // meaningless\n        'allNullOrNull',        // meaningless\n        'allNullOrNotNull',     // meaningless\n    ];\n\n    public function generate(): string\n    {\n        return \\sprintf(\n            <<<'PHP'\n<?php\n\ndeclare(strict_types=1);\n\n%s\nPHP\n            ,\n            $this->namespace()\n        );\n    }\n\n    private function namespace(): string\n    {\n        $assert = new ReflectionClass(Assert::class);\n\n        $namespace = sprintf(\"namespace %s;\\n\\n\", $assert->getNamespaceName());\n        $namespace .= sprintf(\"use %s;\\n\", ArrayAccess::class);\n        $namespace .= sprintf(\"use %s;\\n\", Countable::class);\n        $namespace .= sprintf(\"use %s;\\n\", Throwable::class);\n        $namespace .= \"\\n\";\n\n        $namespace .= $this->trait($assert);\n\n        return $namespace;\n    }\n\n    private function trait(ReflectionClass $assert): string\n    {\n        $staticMethods = $this->getMethods($assert);\n\n        $declaredMethods = [];\n\n        foreach ($staticMethods as $method) {\n            $nullOr = $this->nullOr($method, 4);\n            if (null !== $nullOr) {\n                $declaredMethods[] = $nullOr;\n            }\n\n            $all = $this->all($method, 4);\n            if (null !== $all) {\n                $declaredMethods[] = $all;\n            }\n\n            $allNullOr = $this->allNullOr($method, 4);\n            if (null !== $allNullOr) {\n                $declaredMethods[] = $allNullOr;\n            }\n        }\n\n        return \\sprintf(\n            <<<'PHP'\n/**\n * This trait provides nullOr*, all* and allNullOr* variants of assertion base methods.\n * Do not use this trait directly: it will change, and is not designed for reuse.\n */\ntrait Mixin\n{\n%s\n}\n\nPHP\n            ,\n            \\implode(\"\\n\\n\", $declaredMethods)\n        );\n    }\n\n    /**\n     * @param ReflectionMethod $method\n     * @param int              $indent\n     *\n     * @return string|null\n     *\n     * @throws ReflectionException\n     */\n    private function nullOr(ReflectionMethod $method, int $indent): ?string\n    {\n        return $this->assertion($method, 'nullOr%s', '%s|null', $indent, function (string $firstParameter, string $parameters) use ($method) {\n            return <<<BODY\nnull === {$firstParameter} || static::{$method->name}({$firstParameter}, {$parameters});\n\nreturn {$firstParameter};\nBODY;\n        });\n    }\n\n    /**\n     * @param ReflectionMethod $method\n     * @param int              $indent\n     *\n     * @return string|null\n     *\n     * @throws ReflectionException\n     */\n    private function all(ReflectionMethod $method, int $indent): ?string\n    {\n        return $this->assertion($method, 'all%s', 'iterable<%s>', $indent, function (string $firstParameter, string $parameters) use ($method) {\n            return <<<BODY\nstatic::isIterable({$firstParameter});\n\nforeach ({$firstParameter} as \\$entry) {\n    static::{$method->name}(\\$entry, {$parameters});\n}\n\nreturn {$firstParameter};\nBODY;\n        });\n    }\n\n    /**\n     * @param ReflectionMethod $method\n     * @param int              $indent\n     *\n     * @return string|null\n     *\n     * @throws ReflectionException\n     */\n    private function allNullOr(ReflectionMethod $method, int $indent): ?string\n    {\n        return $this->assertion($method, 'allNullOr%s', 'iterable<%s|null>', $indent, function (string $firstParameter, string $parameters) use ($method) {\n            return <<<BODY\nstatic::isIterable({$firstParameter});\n\nforeach ({$firstParameter} as \\$entry) {\n    null === \\$entry || static::{$method->name}(\\$entry, {$parameters});\n}\n\nreturn {$firstParameter};\nBODY;\n        });\n    }\n\n    /**\n     * @psalm-param callable(string,string):string $body\n     *\n     * @param ReflectionMethod $method\n     * @param string           $methodNameTemplate\n     * @param string           $typeTemplate\n     * @param int              $indent\n     * @param callable         $body\n     *\n     * @return string|null\n     *\n     * @throws ReflectionException\n     */\n    private function assertion(ReflectionMethod $method, string $methodNameTemplate, string $typeTemplate, int $indent, callable $body): ?string\n    {\n        $newMethodName = sprintf($methodNameTemplate, ucfirst($method->name));\n\n        $comment = $method->getDocComment();\n\n        $parsedComment = $this->parseDocComment($comment);\n\n        $parameters = [];\n        /** @psalm-var array<string, scalar|null> $parametersDefaults */\n        $parametersDefaults = [];\n        /** @var array<string, string> $parameterTypes */\n        $parameterTypes = [];\n        $parametersReflection = $method->getParameters();\n        $nativeReturnType = 'mixed';\n\n        foreach ($parametersReflection as $parameterReflection) {\n            $parameters[] = $parameterReflection->name;\n\n            if ($parameterReflection->isDefaultValueAvailable()) {\n                $defaultValue = $parameterReflection->getDefaultValue();\n                $defaultValue = Assert::nullOrScalar($defaultValue);\n\n                $parametersDefaults[$parameterReflection->name] = $defaultValue;\n            }\n\n            if ($parameterReflection->hasType()) {\n                if ($parameterReflection->name === 'value') {\n                    $parameterTypes[$parameterReflection->name] = 'mixed';\n\n                    $nativeReturnType = match ($typeTemplate) {\n                        '%s|null' => $this->reduceParameterType($parameterReflection->getType()),\n                        'iterable<%s>' => 'iterable',\n                        'iterable<%s|null>' => 'iterable',\n                    };\n                } else {\n                    $parameterTypes[$parameterReflection->name] = $this->reduceParameterType($parameterReflection->getType());\n                }\n            }\n        }\n\n        if (in_array($newMethodName, $this->skipMethods, true)) {\n            return null;\n        }\n\n        $paramsAdded = false;\n\n        $phpdocReturnType = 'mixed';\n\n        $phpdocLines = [];\n        foreach ($parsedComment as $key => $values) {\n            if ($this->shouldSkipAnnotation($newMethodName, $key)) {\n                continue;\n            }\n\n            if ($paramsAdded || 'param' === $key) {\n                $paramsAdded = true;\n                if (count($phpdocLines) > 0) {\n                    $phpdocLines[] = '';\n                }\n            }\n\n            if ('deprecated' === $key) {\n                $phpdocLines[] = '';\n            }\n\n            $longestType = 0;\n            $longestName = 0;\n\n            foreach ($values as $i => $value) {\n                $parts = $this->splitDocLine($value);\n                if (('param' === $key || 'psalm-param' === $key) && isset($parts[1]) && isset($parameters[0]) && $parts[1] === '$'.$parameters[0] && 'mixed' !== $parts[0]) {\n                    $parts[0] = $this->applyTypeTemplate($parts[0], $typeTemplate);\n\n                    $values[$i] = \\implode(' ', $parts);\n                }\n            }\n\n            if ('psalm-return' === $key || 'return' === $key) {\n                continue;\n            }\n\n            if ('param' === $key) {\n                [$longestType, $longestName] = $this->findLongestTypeAndName($values);\n            }\n\n            foreach ($values as $value) {\n                $parts = $this->splitDocLine($value);\n                $type = $parts[0];\n\n                if ('psalm-assert' === $key) {\n                    $type = $this->applyTypeTemplate($type, $typeTemplate);\n\n                    $phpdocReturnType = $type;\n                }\n\n                if ('param' === $key) {\n                    if (!isset($parts[1])) {\n                        throw new RuntimeException(sprintf('param key must come with type and variable name in method: %s', $method->name));\n                    }\n\n                    $type = str_pad($type, $longestType, ' ');\n                    $parts[1] = str_pad($parts[1], $longestName, ' ');\n                }\n\n                $comment = sprintf('@%s %s', $key, $type);\n                if (count($parts) >= 2) {\n                    $comment .= sprintf(' %s', \\implode(' ', array_slice($parts, 1)));\n                }\n\n                $phpdocLines[] = trim($comment);\n            }\n\n            if ('deprecated' === $key || 'psalm-pure' === $key || 'psalm-assert' === $key || 'see' === $key) {\n                $phpdocLines[] = '';\n            }\n        }\n\n        $phpdocLines[] = '@return '.$phpdocReturnType;\n        $phpdocLines[] = '';\n\n        $phpdocLinesDeduplicatedEmptyLines = [];\n        foreach ($phpdocLines as $line) {\n            $currentLine = trim($line);\n            if ('' === $currentLine && count($phpdocLinesDeduplicatedEmptyLines) > 0) {\n                $previousLine = trim($phpdocLinesDeduplicatedEmptyLines[count($phpdocLinesDeduplicatedEmptyLines) - 1]);\n                if ('' === $previousLine) {\n                    continue;\n                }\n            }\n\n            $phpdocLinesDeduplicatedEmptyLines[] = $line;\n        }\n\n        return $this->staticMethod($newMethodName, $parameters, $parameterTypes, $parametersDefaults, $phpdocLinesDeduplicatedEmptyLines, $indent, $body, $nativeReturnType);\n    }\n\n    private function reduceParameterType(ReflectionType $type): string\n    {\n        if ($type instanceof ReflectionIntersectionType) {\n            return \\implode('&', \\array_map([$this, 'reduceParameterType'], $type->getTypes()));\n        }\n\n        if ($type instanceof ReflectionUnionType) {\n            return \\implode('|', \\array_map([$this, 'reduceParameterType'], $type->getTypes()));\n        }\n\n        $type = Assert::isInstanceOf($type, ReflectionNamedType::class);\n\n        if ($type->getName() === 'mixed') {\n            return $type->getName();\n        }\n\n        return ($type->allowsNull() ? '?' : '') . $type->getName();\n    }\n\n    private function applyTypeTemplate(string $type, string $typeTemplate): string\n    {\n        $combinedType = sprintf($typeTemplate, $type);\n\n        if ('empty|null' === $combinedType) {\n            $combinedType = 'empty'; // @see https://github.com/vimeo/psalm/issues/3492\n        }\n\n        return $combinedType;\n    }\n\n    private function shouldSkipAnnotation(string $newMethodName, string $key): bool\n    {\n        if (!in_array($newMethodName, $this->unsupportedMethods, true)) {\n            return false;\n        }\n\n        return 'psalm-assert' === $key || 'psalm-return' === $key;\n    }\n\n    /**\n     * @psalm-param array<int, string> $values\n     * @psalm-return array{int, int}\n     *\n     * @param string[] $values\n     *\n     * @return int[]\n     */\n    private function findLongestTypeAndName(array $values): array\n    {\n        $longestType = 0;\n        $longestName = 0;\n\n        foreach ($values as $value) {\n            $parts = $this->splitDocLine($value);\n            $type = $parts[0];\n            if (strlen($type) > $longestType) {\n                $longestType = strlen($type);\n            }\n\n            if (!isset($parts[1])) {\n                continue;\n            }\n\n            $name = $parts[1];\n            if (strlen($name) > $longestName) {\n                $longestName = strlen($name);\n            }\n        }\n\n        return [$longestType, $longestName];\n    }\n\n    /**\n     * @psalm-param list<string>                   $parameters\n     * @psalm-param array<string, scalar|null>     $defaults\n     * @psalm-param list<string>                   $phpdocLines\n     *\n     * @param string                               $name\n     * @param string[]                             $parameters\n     * @param array<string, string>                $types\n     * @param string[]                             $defaults\n     * @param array                                $phpdocLines\n     * @param int                                  $indent\n     * @param callable(string,string): string      $body\n     * @param string                               $returnType\n     *\n     * @return string\n     */\n    private function staticMethod(string $name, array $parameters, array $types, array $defaults, array $phpdocLines, int $indent, callable $body, string $returnType): string\n    {\n        Assert::notEmpty($parameters);\n\n        $indentation = str_repeat(' ', $indent);\n\n        $parameterList = \\array_map(static fn (string $parameter): string => '$'.$parameter, $parameters);\n        $firstParameter = \\array_shift($parameterList);\n        $parameterList = \\implode(', ', $parameterList);\n\n        $methodBody = \\preg_replace('/(?<=^|\\n)(?!\\n)/', $indentation.$indentation, $body($firstParameter, $parameterList));\n\n        Assert::stringNotEmpty($methodBody);\n\n        $staticFunction = $this->phpdoc($phpdocLines, $indent).\"\\n\";\n        $staticFunction .= $indentation.'public static function '.$name.$this->functionParameters($parameters, $types, $defaults).\": {$returnType}\\n\"\n            .$indentation.\"{\\n\";\n        $staticFunction .= $methodBody.\"\\n\".$indentation.\"}\";\n\n        return $staticFunction;\n    }\n\n    /**\n     * @psalm-param list<string>               $parameters\n     * @psalm-param array<string, scalar|null> $defaults\n     *\n     * @param string[]                         $parameters\n     * @param array<string, string>            $types\n     * @param string[]                         $defaults\n     *\n     * @return string\n     */\n    private function functionParameters(array $parameters, array $types, array $defaults): string\n    {\n        $result = '';\n\n        foreach ($parameters as $i => $parameter) {\n            if ($i > 0) {\n                $result .= ', ';\n            }\n\n            Assert::keyExists($types, $parameter);\n\n            $result .= $types[$parameter].' $'.$parameter;\n\n            if (array_key_exists($parameter, $defaults)) {\n                $defaultValue = null === $defaults[$parameter] ? 'null' : var_export($defaults[$parameter], true);\n\n                $result .= ' = '.$defaultValue;\n            }\n        }\n\n        return '('.$result.')';\n    }\n\n    /**\n     * @psalm-param list<string> $lines\n     *\n     * @param string[] $lines\n     * @param int      $indent\n     *\n     * @return string\n     */\n    private function phpdoc(array $lines, int $indent): string\n    {\n        $indentation = str_repeat(' ', $indent);\n\n        $phpdoc = $indentation.'/**';\n        $throws = '';\n\n        foreach ($lines as $line) {\n            if (\\str_starts_with($line, '@throws')) {\n                $throws .= \"\\n\".$indentation.\\rtrim(' * '.$line);\n            } else {\n                $phpdoc .= \"\\n\".$indentation.\\rtrim(' * '.$line);\n            }\n        }\n\n        if (strlen($throws) > 0) {\n            $phpdoc .= $throws;\n        }\n\n        $phpdoc .= \"\\n\".$indentation.' */';\n\n        return $phpdoc;\n    }\n\n    /**\n     * @psalm-return array<string, list<string>>\n     *\n     * @param string $comment\n     *\n     * @return string[][]\n     */\n    private function parseDocComment(string $comment): array\n    {\n        $lines = explode(\"\\n\", $comment);\n\n        $result = [];\n\n        foreach ($lines as $line) {\n            if (preg_match('~^\\*\\s+@(\\S+)(\\s+.*)?$~', trim($line), $matches)) {\n                if (2 === count($matches)) {\n                    $matches[2] = '';\n                }\n                $result[$matches[1]][] = trim($matches[2]);\n            }\n        }\n\n        return $result;\n    }\n\n    /**\n     * @psalm-return list{string, string|null, string|null}\n     *\n     * @param string $line\n     *\n     * @return string[]\n     */\n    private function splitDocLine(string $line): array\n    {\n        if (!preg_match('~^(.*)\\s+(\\$\\S+)(?:\\s+(.*))?$~', $line, $matches)) {\n            return [$line, null, null];\n        }\n\n        return [trim($matches[1]), $matches[2], $matches[3] ?? null];\n    }\n\n    /**\n     * @psalm-return list<ReflectionMethod>\n     *\n     * @param ReflectionClass $assert\n     *\n     * @return ReflectionMethod[]\n     */\n    private function getMethods(ReflectionClass $assert): array\n    {\n        $methods = [];\n\n        $staticMethods = $assert->getMethods(ReflectionMethod::IS_STATIC);\n\n        foreach ($staticMethods as $staticMethod) {\n            if (in_array($staticMethod->name, $this->skipGenerateForMethods)) {\n                continue;\n            }\n\n            $modifiers = $staticMethod->getModifiers();\n            if (0 === ($modifiers & ReflectionMethod::IS_PUBLIC)) {\n                continue;\n            }\n\n            if ($staticMethod->getFileName() !== $assert->getFileName()) {\n                // Skip this method - was imported by generated mixin\n                continue;\n            }\n\n            if ('__callStatic' === $staticMethod->name) {\n                continue;\n            }\n\n            $methods[] = $staticMethod;\n        }\n\n        return $methods;\n    }\n}\n"
  },
  {
    "path": "composer.json",
    "content": "{\n    \"name\": \"webmozart/assert\",\n    \"description\": \"Assertions to validate method input/output with nice error messages.\",\n    \"license\": \"MIT\",\n    \"keywords\": [\n        \"assert\",\n        \"check\",\n        \"validate\"\n    ],\n    \"authors\": [\n        {\n            \"name\": \"Bernhard Schussek\",\n            \"email\": \"bschussek@gmail.com\"\n        },\n        {\n            \"name\": \"Woody Gilk\",\n            \"email\": \"woody.gilk@gmail.com\"\n        }\n    ],\n    \"require\": {\n        \"php\": \"^8.2\",\n        \"ext-ctype\": \"*\",\n        \"ext-date\": \"*\",\n        \"ext-filter\": \"*\"\n    },\n    \"suggest\": {\n        \"ext-intl\": \"\",\n        \"ext-simplexml\": \"\",\n        \"ext-spl\": \"\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Webmozart\\\\Assert\\\\\": \"src/\"\n        }\n    },\n    \"autoload-dev\": {\n        \"psr-4\": {\n            \"Webmozart\\\\Assert\\\\Bin\\\\\": \"bin/src\",\n            \"Webmozart\\\\Assert\\\\Tests\\\\\": \"tests/\"\n        }\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-feature/2-0\": \"2.0-dev\"\n        }\n    },\n    \"scripts\": {\n        \"install-tools\": [\n            \"composer --working-dir=tools/php-cs-fixer install\",\n            \"composer --working-dir=tools/phpunit install\",\n            \"composer --working-dir=tools/psalm install\",\n            \"composer --working-dir=tools/roave-bc-check install\"\n        ],\n        \"update-tools\": [\n            \"composer --working-dir=tools/php-cs-fixer update\",\n            \"composer --working-dir=tools/phpunit update\",\n            \"composer --working-dir=tools/psalm update\",\n            \"composer --working-dir=tools/roave-bc-check update\"\n        ],\n        \"generate-mixin\": \"php bin/generate.php\",\n        \"bc-check\": \"./tools/roave-bc-check/vendor/bin/roave-backward-compatibility-check\",\n        \"cs-check\" : \"./tools/php-cs-fixer/vendor/bin/php-cs-fixer check\",\n        \"cs-fix\": \"./tools/php-cs-fixer/vendor/bin/php-cs-fixer fix\",\n        \"static-analysis\": \"./tools/psalm/vendor/bin/psalm --threads=4 --root=$(pwd)\",\n        \"test\": \"./tools/phpunit/vendor/bin/phpunit\"\n    }\n}\n"
  },
  {
    "path": "phpunit.xml.dist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<phpunit xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:noNamespaceSchemaLocation=\"./vendor/phpunit/phpunit/phpunit.xsd\"\n         bootstrap=\"vendor/autoload.php\"\n         colors=\"true\">\n  <testsuites>\n    <testsuite name=\"Webmozart Assert Test Suite\">\n      <directory>./tests/</directory>\n      <exclude>./tests/static-analysis</exclude>\n    </testsuite>\n  </testsuites>\n  <source>\n    <include>\n      <directory suffix=\".php\">./src/</directory>\n    </include>\n  </source>\n</phpunit>\n"
  },
  {
    "path": "psalm.xml",
    "content": "<?xml version=\"1.0\"?>\n<psalm\n    errorLevel=\"8\"\n    resolveFromConfigFile=\"true\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n    xmlns=\"https://getpsalm.org/schema/config\"\n    xsi:schemaLocation=\"https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd\"\n>\n    <projectFiles>\n        <directory name=\"bin\"/>\n        <directory name=\"tests/static-analysis\" />\n    </projectFiles>\n</psalm>\n"
  },
  {
    "path": "src/Assert.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/*\n * This file is part of the webmozart/assert package.\n *\n * (c) Bernhard Schussek <bschussek@gmail.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Webmozart\\Assert;\n\nuse ArrayAccess;\nuse Closure;\nuse Countable;\nuse DateTime;\nuse DateTimeImmutable;\nuse ReflectionFunction;\nuse ReflectionProperty;\nuse Throwable;\nuse Traversable;\n\n/**\n * Efficient assertions to validate the input/output of your methods.\n *\n * @since  1.0\n *\n * @author Bernhard Schussek <bschussek@gmail.com>\n */\nclass Assert\n{\n    use Mixin;\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert string $value\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function string(mixed $value, string $message = ''): string\n    {\n        if (!\\is_string($value)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a string. Got: %s',\n                static::typeToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert non-empty-string $value\n     *\n     * @psalm-return non-empty-string\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function stringNotEmpty(mixed $value, string $message = ''): string\n    {\n        static::string($value, $message);\n        static::notSame($value, '', $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert int $value\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function integer(mixed $value, string $message = ''): int\n    {\n        if (!\\is_int($value)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected an integer. Got: %s',\n                static::typeToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert numeric $value\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function integerish(mixed $value, string $message = ''): int|float|string\n    {\n        if (!\\is_numeric($value) || $value != (int) $value) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected an integerish value. Got: %s',\n                static::typeToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert positive-int $value\n     *\n     * @psalm-return positive-int\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function positiveInteger(mixed $value, string $message = ''): int\n    {\n        static::integer($value, $message);\n\n        if ($value < 1) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a positive integer. Got: %s',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     * @psalm-assert non-negative-int $value\n     *\n     * @psalm-return non-negative-int\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function notNegativeInteger(mixed $value, string $message = ''): int\n    {\n        static::integer($value, $message);\n\n        if ($value < 0) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a non negative integer. Got: %s',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     * @psalm-assert negative-int $value\n     *\n     * @psalm-return negative-int\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function negativeInteger(mixed $value, string $message = ''): int\n    {\n        static::integer($value, $message);\n\n        if ($value >= 0) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a negative integer. Got: %s',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert float $value\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function float(mixed $value, string $message = ''): float\n    {\n        if (!\\is_float($value)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a float. Got: %s',\n                static::typeToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert numeric $value\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function numeric(mixed $value, string $message = ''): int|float|string\n    {\n        if (!\\is_numeric($value)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a numeric. Got: %s',\n                static::typeToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert positive-int|0 $value\n     *\n     * @psalm-return positive-int|0\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function natural(mixed $value, string $message = ''): int\n    {\n        if (!\\is_int($value) || $value < 0) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a non-negative integer. Got: %s',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert bool $value\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function boolean(mixed $value, string $message = ''): bool\n    {\n        if (!\\is_bool($value)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a boolean. Got: %s',\n                static::typeToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert scalar $value\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function scalar(mixed $value, string $message = ''): int|bool|float|string\n    {\n        if (!\\is_scalar($value)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a scalar. Got: %s',\n                static::typeToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert object $value\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function object(mixed $value, string $message = ''): object\n    {\n        if (!\\is_object($value)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected an object. Got: %s',\n                static::typeToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert object|string $value\n     *\n     * @psalm-return object|string\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function objectish(mixed $value, string $message = ''): object|string\n    {\n        if (!\\is_object($value) && !\\is_string($value)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected an objectish value. Got: %s',\n                static::typeToString($value)\n            ));\n        }\n\n        if (\\is_string($value) && !\\class_exists($value)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected class to be defined. Got: %s',\n                $value\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert resource $value\n     *\n     * @see https://www.php.net/manual/en/function.get-resource-type.php\n     *\n     * @psalm-return resource\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function resource(mixed $value, ?string $type = null, string $message = ''): mixed\n    {\n        if (!\\is_resource($value)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a resource. Got: %s',\n                static::typeToString($value),\n                $type // User supplied message might include the second placeholder.\n            ));\n        }\n\n        if ($type && $type !== \\get_resource_type($value)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a resource of type %2$s. Got: %s',\n                static::typeToString($value),\n                $type\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert object $value\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function isInitialized(mixed $value, string $property, string $message = ''): object\n    {\n        Assert::object($value);\n\n        $reflectionProperty = new ReflectionProperty($value, $property);\n\n        if (!$reflectionProperty->isInitialized($value)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected property %s to be initialized.',\n                $property,\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert callable $value\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function isCallable(mixed $value, string $message = ''): callable\n    {\n        if (!\\is_callable($value)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a callable. Got: %s',\n                static::typeToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert array $value\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function isArray(mixed $value, string $message = ''): array\n    {\n        if (!\\is_array($value)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected an array. Got: %s',\n                static::typeToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert array|ArrayAccess $value\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function isArrayAccessible(mixed $value, string $message = ''): array|ArrayAccess\n    {\n        if (!\\is_array($value) && !($value instanceof ArrayAccess)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected an array accessible. Got: %s',\n                static::typeToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert countable $value\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function isCountable(mixed $value, string $message = ''): array|Countable\n    {\n        if (!\\is_array($value) && !($value instanceof Countable)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a countable. Got: %s',\n                static::typeToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable $value\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function isIterable(mixed $value, string $message = ''): iterable\n    {\n        if (!\\is_array($value) && !($value instanceof Traversable)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected an iterable. Got: %s',\n                static::typeToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @template T of object\n     *\n     * @psalm-assert T $value\n     *\n     * @psalm-param class-string<T> $class\n     *\n     * @return T\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function isInstanceOf(mixed $value, mixed $class, string $message = ''): object\n    {\n        static::string($class, 'Expected class as a string. Got: %s');\n\n        if (!($value instanceof $class)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected an instance of %2$s. Got: %s',\n                static::typeToString($value),\n                $class\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @template T of object\n     *\n     * @psalm-assert object $value\n     * @psalm-param class-string<T> $class\n     *\n     * @return !T\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function notInstanceOf(mixed $value, mixed $class, string $message = ''): object\n    {\n        static::string($class, 'Expected class as a string. Got: %s');\n\n        if (!\\is_object($value) || $value instanceof $class) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected an instance other than %2$s. Got: %s',\n                static::typeToString($value),\n                $class\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @template T of object\n     *\n     * @psalm-assert T $value\n     *\n     * @param T $value\n     *\n     * @return T\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function isInstanceOfAny(mixed $value, mixed $classes, string $message = ''): object\n    {\n        static::isIterable($classes);\n\n        foreach ($classes as $class) {\n            static::string($class, 'Expected class as a string. Got: %s');\n\n            if ($value instanceof $class) {\n                return $value;\n            }\n        }\n\n        static::reportInvalidArgument(\\sprintf(\n            $message ?: 'Expected an instance of any of %2$s. Got: %s',\n            static::typeToString($value),\n            \\implode(', ', \\array_map(static::valueToString(...), \\iterator_to_array($classes)))\n        ));\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @template T of object\n     *\n     * @psalm-assert T|class-string<T> $value\n     *\n     * @return T\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function isAOf(mixed $value, mixed $class, string $message = ''): object|string\n    {\n        static::string($class, 'Expected class as a string. Got: %s');\n\n        if (!\\is_a($value, $class, \\is_string($value))) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected an instance of this class or to this class among its parents \"%2$s\". Got: %s',\n                static::valueToString($value),\n                $class\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @template T\n     *\n     * @psalm-assert object|class-string $value\n     *\n     * @param T $value\n     *\n     * @return T\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function isNotA(mixed $value, mixed $class, string $message = ''): object|string\n    {\n        static::objectish($value, $message);\n        static::string($class, 'Expected class as a string. Got: %s');\n\n        if (\\is_a($value, $class, \\is_string($value))) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected an instance of this class or to this class among its parents other than \"%2$s\". Got: %s',\n                static::valueToString($value),\n                $class\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @param object|string $value\n     * @param string[]      $classes\n     * @psalm-param array<class-string> $classes\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function isAnyOf(mixed $value, mixed $classes, string $message = ''): object|string\n    {\n        static::objectish($value, $message);\n        static::isIterable($classes);\n\n        foreach ($classes as $class) {\n            static::string($class, 'Expected class as a string. Got: %s');\n\n            if (\\is_a($value, $class, \\is_string($value))) {\n                return $value;\n            }\n        }\n\n        static::reportInvalidArgument(\\sprintf(\n            $message ?: 'Expected an instance of any of this classes or any of those classes among their parents \"%2$s\". Got: %s',\n            static::valueToString($value),\n            \\implode(', ', \\iterator_to_array($classes))\n        ));\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert empty $value\n     *\n     * @psalm-return empty\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function isEmpty(mixed $value, string $message = ''): mixed\n    {\n        if (!empty($value)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected an empty value. Got: %s',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert !empty $value\n     *\n     * @psalm-return !empty\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function notEmpty(mixed $value, string $message = ''): mixed\n    {\n        if (empty($value)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a non-empty value. Got: %s',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert null $value\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function null(mixed $value, string $message = ''): null\n    {\n        if (null !== $value) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected null. Got: %s',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert !null $value\n     *\n     * @psalm-return !null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function notNull(mixed $value, string $message = ''): mixed\n    {\n        if (null === $value) {\n            static::reportInvalidArgument(\n                $message ?: 'Expected a value other than null.'\n            );\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert true $value\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function true(mixed $value, string $message = ''): true\n    {\n        if (true !== $value) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value to be true. Got: %s',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert false $value\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function false(mixed $value, string $message = ''): false\n    {\n        if (false !== $value) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value to be false. Got: %s',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert !false $value\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function notFalse(mixed $value, string $message = ''): mixed\n    {\n        if (false === $value) {\n            static::reportInvalidArgument(\n                $message ?: 'Expected a value other than false.'\n            );\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-param string $value\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function ip(mixed $value, string $message = ''): string\n    {\n        static::string($value, $message);\n\n        if (false === \\filter_var($value, \\FILTER_VALIDATE_IP)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value to be an IP. Got: %s',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-param string $value\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function ipv4(mixed $value, string $message = ''): string\n    {\n        static::string($value, $message);\n\n        if (false === \\filter_var($value, \\FILTER_VALIDATE_IP, \\FILTER_FLAG_IPV4)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value to be an IPv4. Got: %s',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-param string $value\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function ipv6(mixed $value, string $message = ''): string\n    {\n        static::string($value, $message);\n\n        if (false === \\filter_var($value, \\FILTER_VALIDATE_IP, \\FILTER_FLAG_IPV6)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value to be an IPv6. Got: %s',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-param string $value\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function email(mixed $value, string $message = ''): string\n    {\n        static::string($value, $message);\n\n        if (false === \\filter_var($value, FILTER_VALIDATE_EMAIL, FILTER_FLAG_EMAIL_UNICODE)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value to be a valid e-mail address. Got: %s',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * Does non-strict comparisons on the items, so ['3', 3] will not pass the assertion.\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function uniqueValues(mixed $values, string $message = ''): array\n    {\n        static::isArray($values);\n\n        $allValues = \\count($values);\n        $uniqueValues = \\count(\\array_unique($values));\n\n        if ($allValues !== $uniqueValues) {\n            $difference = $allValues - $uniqueValues;\n\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected an array of unique values, but %s of them %s duplicated',\n                $difference,\n                1 === $difference ? 'is' : 'are'\n            ));\n        }\n\n        return $values;\n    }\n\n    /**\n     * @throws InvalidArgumentException\n     */\n    public static function eq(mixed $value, mixed $expect, string $message = ''): mixed\n    {\n        if ($expect != $value) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value equal to %2$s. Got: %s',\n                static::valueToString($value),\n                static::valueToString($expect)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @throws InvalidArgumentException\n     */\n    public static function notEq(mixed $value, mixed $expect, string $message = ''): mixed\n    {\n        if ($expect == $value) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a different value than %s.',\n                static::valueToString($expect)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function same(mixed $value, mixed $expect, string $message = ''): mixed\n    {\n        if ($expect !== $value) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value identical to %2$s. Got: %s',\n                static::valueToString($value),\n                static::valueToString($expect)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function notSame(mixed $value, mixed $expect, string $message = ''): mixed\n    {\n        if ($expect === $value) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value not identical to %s.',\n                static::valueToString($expect)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function greaterThan(mixed $value, mixed $limit, string $message = ''): mixed\n    {\n        if ($value <= $limit) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value greater than %2$s. Got: %s',\n                static::valueToString($value),\n                static::valueToString($limit)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function greaterThanEq(mixed $value, mixed $limit, string $message = ''): mixed\n    {\n        if ($value < $limit) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value greater than or equal to %2$s. Got: %s',\n                static::valueToString($value),\n                static::valueToString($limit)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function lessThan(mixed $value, mixed $limit, string $message = ''): mixed\n    {\n        if ($value >= $limit) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value less than %2$s. Got: %s',\n                static::valueToString($value),\n                static::valueToString($limit)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function lessThanEq(mixed $value, mixed $limit, string $message = ''): mixed\n    {\n        if ($value > $limit) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value less than or equal to %2$s. Got: %s',\n                static::valueToString($value),\n                static::valueToString($limit)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * Inclusive range, so Assert::(3, 3, 5) passes.\n     *\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function range(mixed $value, mixed $min, mixed $max, string $message = ''): mixed\n    {\n        if ($value < $min || $value > $max) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value between %2$s and %3$s. Got: %s',\n                static::valueToString($value),\n                static::valueToString($min),\n                static::valueToString($max)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * A more human-readable alias of Assert::inArray().\n     *\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function oneOf(mixed $value, mixed $values, string $message = ''): mixed\n    {\n        static::inArray($value, $values, $message);\n\n        return $value;\n    }\n\n    /**\n     * Does strict comparison, so Assert::inArray(3, ['3']) does not pass the assertion.\n     *\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function inArray(mixed $value, mixed $values, string $message = ''): mixed\n    {\n        static::isArray($values);\n\n        if (!\\in_array($value, $values, true)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected one of: %2$s. Got: %s',\n                static::valueToString($value),\n                \\implode(', ', \\array_map(static::valueToString(...), $values))\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * A more human-readable alias of Assert::notInArray().\n     *\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function notOneOf(mixed $value, mixed $values, string $message = ''): mixed\n    {\n        static::notInArray($value, $values, $message);\n\n        return $value;\n    }\n\n    /**\n     * Check that a value is not present\n     *\n     * Does strict comparison, so Assert::notInArray(3, [1, 2, 3]) will not pass\n     * the assertion, but Assert::notInArray(3, ['3']) will.\n     *\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function notInArray(mixed $value, mixed $values, string $message = ''): mixed\n    {\n        static::isArray($values);\n\n        if (\\in_array($value, $values, true)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: '%2$s was not expected to contain a value. Got: %s',\n                static::valueToString($value),\n                \\implode(', ', \\array_map(static::valueToString(...), $values))\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function contains(mixed $value, mixed $subString, string $message = ''): string\n    {\n        static::string($value);\n        static::string($subString);\n\n        if (!\\str_contains($value, $subString)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value to contain %2$s. Got: %s',\n                static::valueToString($value),\n                static::valueToString($subString)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function notContains(mixed $value, mixed $subString, string $message = ''): string\n    {\n        static::string($value);\n        static::string($subString);\n\n        if (\\str_contains($value, $subString)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: '%2$s was not expected to be contained in a value. Got: %s',\n                static::valueToString($value),\n                static::valueToString($subString)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function notWhitespaceOnly(mixed $value, string $message = ''): string\n    {\n        static::string($value);\n\n        if (\\preg_match('/^\\s*$/', $value)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a non-whitespace string. Got: %s',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function startsWith(mixed $value, mixed $prefix, string $message = ''): string\n    {\n        static::string($value);\n        static::string($prefix);\n\n        if (!\\str_starts_with($value, $prefix)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value to start with %2$s. Got: %s',\n                static::valueToString($value),\n                static::valueToString($prefix)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function notStartsWith(mixed $value, mixed $prefix, string $message = ''): string\n    {\n        static::string($value);\n        static::string($prefix);\n\n        if (\\str_starts_with($value, $prefix)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value not to start with %2$s. Got: %s',\n                static::valueToString($value),\n                static::valueToString($prefix)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function startsWithLetter(mixed $value, string $message = ''): string\n    {\n        static::string($value);\n\n        $valid = isset($value[0]);\n\n        if ($valid) {\n            $locale = \\setlocale(LC_CTYPE, '0');\n            \\setlocale(LC_CTYPE, 'C');\n            $valid = \\ctype_alpha($value[0]);\n            \\setlocale(LC_CTYPE, $locale);\n        }\n\n        if (!$valid) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value to start with a letter. Got: %s',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function endsWith(mixed $value, mixed $suffix, string $message = ''): string\n    {\n        static::string($value);\n        static::string($suffix);\n\n        if (!\\str_ends_with($value, $suffix)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value to end with %2$s. Got: %s',\n                static::valueToString($value),\n                static::valueToString($suffix)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function notEndsWith(mixed $value, mixed $suffix, string $message = ''): string\n    {\n        static::string($value);\n        static::string($suffix);\n\n        if (\\str_ends_with($value, $suffix)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value not to end with %2$s. Got: %s',\n                static::valueToString($value),\n                static::valueToString($suffix)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function regex(mixed $value, mixed $pattern, string $message = ''): string\n    {\n        static::string($value);\n        static::string($pattern);\n\n        if (!\\preg_match($pattern, $value)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'The value %s does not match the expected pattern.',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function notRegex(mixed $value, mixed $pattern, string $message = ''): string\n    {\n        static::string($value);\n        static::string($pattern);\n\n        if (\\preg_match($pattern, $value, $matches, PREG_OFFSET_CAPTURE)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'The value %s matches the pattern %s (at offset %d).',\n                static::valueToString($value),\n                static::valueToString($pattern),\n                $matches[0][1]\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function unicodeLetters(mixed $value, string $message = ''): string\n    {\n        static::string($value, $message);\n\n        if (!\\preg_match('/^\\p{L}+$/u', $value)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value to contain only Unicode letters. Got: %s',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function alpha(mixed $value, string $message = ''): string\n    {\n        static::string($value, $message);\n\n        $locale = \\setlocale(LC_CTYPE, '0');\n        \\setlocale(LC_CTYPE, 'C');\n        $valid = !\\ctype_alpha($value);\n        \\setlocale(LC_CTYPE, $locale);\n\n        if ($valid) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value to contain only letters. Got: %s',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function digits(mixed $value, string $message = ''): string\n    {\n        static::string($value, $message);\n\n        $locale = \\setlocale(LC_CTYPE, '0');\n        \\setlocale(LC_CTYPE, 'C');\n        $valid = !\\ctype_digit($value);\n        \\setlocale(LC_CTYPE, $locale);\n\n        if ($valid) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value to contain digits only. Got: %s',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function alnum(mixed $value, string $message = ''): string\n    {\n        static::string($value, $message);\n\n        $locale = \\setlocale(LC_CTYPE, '0');\n        \\setlocale(LC_CTYPE, 'C');\n        $valid = !\\ctype_alnum($value);\n        \\setlocale(LC_CTYPE, $locale);\n\n        if ($valid) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value to contain letters and digits only. Got: %s',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert lowercase-string $value\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function lower(mixed $value, string $message = ''): string\n    {\n        static::string($value, $message);\n\n        $locale = \\setlocale(LC_CTYPE, '0');\n        \\setlocale(LC_CTYPE, 'C');\n        $valid = !\\ctype_lower($value);\n        \\setlocale(LC_CTYPE, $locale);\n\n        if ($valid) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value to contain lowercase characters only. Got: %s',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert !lowercase-string $value\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function upper(mixed $value, string $message = ''): string\n    {\n        static::string($value, $message);\n\n        $locale = \\setlocale(LC_CTYPE, '0');\n        \\setlocale(LC_CTYPE, 'C');\n        $valid = !\\ctype_upper($value);\n        \\setlocale(LC_CTYPE, $locale);\n\n        if ($valid) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value to contain uppercase characters only. Got: %s',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function length(mixed $value, mixed $length, string $message = ''): string\n    {\n        static::string($value);\n        static::integerish($length);\n\n        if ($length !== static::strlen($value)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value to contain %2$s characters. Got: %s',\n                static::valueToString($value),\n                $length\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * Inclusive min.\n     *\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function minLength(mixed $value, mixed $min, string $message = ''): string\n    {\n        static::string($value);\n        static::integerish($min);\n\n        if (static::strlen($value) < $min) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value to contain at least %2$s characters. Got: %s',\n                static::valueToString($value),\n                $min\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * Inclusive max.\n     *\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function maxLength(mixed $value, mixed $max, string $message = ''): string\n    {\n        static::string($value);\n        static::integerish($max);\n\n        if (static::strlen($value) > $max) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value to contain at most %2$s characters. Got: %s',\n                static::valueToString($value),\n                $max\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * Inclusive, so Assert::lengthBetween('asd', 3, 5); passes the assertion.\n     *\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function lengthBetween(mixed $value, mixed $min, mixed $max, string $message = ''): string\n    {\n        static::string($value);\n        static::integerish($min);\n        static::integerish($max);\n\n        $length = static::strlen($value);\n\n        if ($length < $min || $length > $max) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a value to contain between %2$s and %3$s characters. Got: %s',\n                static::valueToString($value),\n                $min,\n                $max\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * Will also pass if $value is a directory, use Assert::file() instead if you need to be sure it is a file.\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function fileExists(mixed $value, string $message = ''): string\n    {\n        static::string($value);\n\n        if (!\\file_exists($value)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'The path %s does not exist.',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @throws InvalidArgumentException\n     */\n    public static function file(mixed $value, string $message = ''): string\n    {\n        static::string($value);\n\n        if (!\\is_file($value)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'The path %s is not a file.',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @throws InvalidArgumentException\n     */\n    public static function directory(mixed $value, string $message = ''): string\n    {\n        static::string($value);\n\n        if (!\\is_dir($value)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'The path %s is not a directory.',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @throws InvalidArgumentException\n     */\n    public static function readable(mixed $value, string $message = ''): string\n    {\n        static::string($value);\n\n        if (!\\is_readable($value)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'The path %s is not readable.',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @throws InvalidArgumentException\n     */\n    public static function writable(mixed $value, string $message = ''): string\n    {\n        static::string($value);\n\n        if (!\\is_writable($value)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'The path %s is not writable.',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-assert class-string $value\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function classExists(mixed $value, string $message = ''): string\n    {\n        static::string($value);\n\n        if (!\\class_exists($value)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected an existing class name. Got: %s',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @template ExpectedType of object\n     *\n     * @psalm-assert class-string<ExpectedType> $value\n     *\n     * @param class-string<ExpectedType> $class\n     *\n     * @return class-string<ExpectedType>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function subclassOf(mixed $value, mixed $class, string $message = ''): string\n    {\n        static::string($value);\n        static::string($class);\n\n        if (!\\is_subclass_of($value, $class)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected a sub-class of %2$s. Got: %s',\n                static::valueToString($value),\n                static::valueToString($class)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-assert class-string $value\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function interfaceExists(mixed $value, string $message = ''): string\n    {\n        static::string($value);\n\n        if (!\\interface_exists($value)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected an existing interface name. got %s',\n                static::valueToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @template ExpectedType of object\n     *\n     * @psalm-assert class-string<ExpectedType>|ExpectedType $value\n     *\n     * @param class-string<ExpectedType>|ExpectedType $value\n     * @param class-string<ExpectedType> $interface\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function implementsInterface(mixed $value, mixed $interface, string $message = ''): object|string\n    {\n        static::objectish($value);\n\n        $implements = \\class_implements($value);\n\n        static::isArray($implements);\n\n        if (!\\in_array($interface, $implements, true)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected an implementation of %2$s. Got: %s',\n                static::valueToString($value),\n                static::valueToString($interface)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @param string|object $classOrObject\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function propertyExists(mixed $classOrObject, mixed $property, string $message = ''): object|string\n    {\n        static::objectish($classOrObject);\n\n        if (!\\property_exists($classOrObject, $property)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected the property %s to exist.',\n                static::valueToString($property)\n            ));\n        }\n\n        return $classOrObject;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @param string|object $classOrObject\n     * @psalm-param class-string|object $classOrObject\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function propertyNotExists(mixed $classOrObject, mixed $property, string $message = ''): mixed\n    {\n        if (!(\\is_string($classOrObject) || \\is_object($classOrObject)) || \\property_exists($classOrObject, $property)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected the property %s to not exist.',\n                static::valueToString($property)\n            ));\n        }\n\n        return $classOrObject;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @param string|object $classOrObject\n     * @psalm-param class-string|object $classOrObject\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function methodExists(mixed $classOrObject, mixed $method, string $message = ''): object|string\n    {\n        static::objectish($classOrObject);\n\n        if (!\\method_exists($classOrObject, $method)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected the method %s to exist.',\n                static::valueToString($method)\n            ));\n        }\n\n        return $classOrObject;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @param string|object $classOrObject\n     * @psalm-param class-string|object $classOrObject\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function methodNotExists(mixed $classOrObject, mixed $method, string $message = ''): mixed\n    {\n        static::objectish($classOrObject);\n\n        if (\\method_exists($classOrObject, $method)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected the method %s to not exist.',\n                static::valueToString($method)\n            ));\n        }\n\n        return $classOrObject;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @param string|int $key\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function keyExists(mixed $array, string|int $key, string $message = ''): array\n    {\n        static::isArray($array, $message);\n\n        if (!(isset($array[$key]) || \\array_key_exists($key, $array))) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected the key %s to exist.',\n                static::valueToString($key)\n            ));\n        }\n\n        return $array;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @param string|int $key\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function keyNotExists(mixed $array, string|int $key, string $message = ''): array\n    {\n        static::isArray($array, $message);\n\n        if (isset($array[$key]) || \\array_key_exists($key, $array)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected the key %s to not exist.',\n                static::valueToString($key)\n            ));\n        }\n\n        return $array;\n    }\n\n    /**\n     * Checks if a value is a valid array key (int or string).\n     *\n     * @psalm-pure\n     *\n     * @psalm-assert array-key $value\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function validArrayKey(mixed $value, string $message = ''): string|int\n    {\n        if (!(\\is_int($value) || \\is_string($value))) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected string or integer. Got: %s',\n                static::typeToString($value)\n            ));\n        }\n\n        return $value;\n    }\n\n    /**\n     * @throws InvalidArgumentException\n     */\n    public static function count(mixed $array, mixed $number, string $message = ''): array|Countable\n    {\n        static::isCountable($array);\n        static::integerish($number);\n\n        static::eq(\n            \\count($array),\n            $number,\n            \\sprintf(\n                $message ?: 'Expected an array to contain %d elements. Got: %d.',\n                $number,\n                \\count($array)\n            )\n        );\n\n        return $array;\n    }\n\n    /**\n     * @throws InvalidArgumentException\n     */\n    public static function minCount(mixed $array, mixed $min, string $message = ''): array|Countable\n    {\n        static::isCountable($array);\n        static::integerish($min);\n\n        if (\\count($array) < $min) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected an array to contain at least %2$d elements. Got: %d',\n                \\count($array),\n                $min\n            ));\n        }\n\n        return $array;\n    }\n\n    /**\n     * @throws InvalidArgumentException\n     */\n    public static function maxCount(mixed $array, mixed $max, string $message = ''): array|Countable\n    {\n        static::isCountable($array);\n        static::integerish($max);\n\n        if (\\count($array) > $max) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected an array to contain at most %2$d elements. Got: %d',\n                \\count($array),\n                $max\n            ));\n        }\n\n        return $array;\n    }\n\n    /**\n     * @throws InvalidArgumentException\n     */\n    public static function countBetween(mixed $array, mixed $min, mixed $max, string $message = ''): array|Countable\n    {\n        static::isCountable($array);\n        static::integerish($min);\n        static::integerish($max);\n\n        $count = \\count($array);\n\n        if ($count < $min || $count > $max) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Expected an array to contain between %2$d and %3$d elements. Got: %d',\n                $count,\n                $min,\n                $max\n            ));\n        }\n\n        return $array;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert list<mixed> $array\n     *\n     * @psalm-return list<mixed>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function isList(mixed $array, string $message = ''): array\n    {\n        if (!\\is_array($array) || !\\array_is_list($array)) {\n            static::reportInvalidArgument(\n                $message ?: 'Expected list - non-associative array.'\n            );\n        }\n\n        return $array;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert non-empty-list<mixed> $array\n     *\n     * @psalm-return non-empty-list<mixed>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function isNonEmptyList(mixed $array, string $message = ''): array\n    {\n        static::isList($array, $message);\n        static::notEmpty($array, $message);\n\n        return $array;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @template T\n     *\n     * @psalm-assert array<string, T> $array\n     *\n     * @param mixed|array<array-key, T> $array\n     *\n     * @return array<string, T>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function isMap(mixed $array, string $message = ''): array\n    {\n        static::isArray($array, $message);\n\n        if (\\count($array) > 0 && \\array_is_list($array)) {\n            static::reportInvalidArgument(\n                $message ?: 'Expected map - associative array with string keys.'\n            );\n        }\n\n        return $array;\n    }\n\n    /**\n     * @psalm-assert callable $callable\n     *\n     * @param Closure|callable $callable\n     *\n     * @return Closure|callable-string\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function isStatic(mixed $callable, string $message = ''): Closure|string\n    {\n        static::isCallable($callable, $message);\n\n        $callable = static::callableToClosure($callable);\n\n        $reflection = new ReflectionFunction($callable);\n\n        if (!$reflection->isStatic()) {\n            static::reportInvalidArgument(\n                $message ?: 'Closure is not static.'\n            );\n        }\n\n        return $callable;\n    }\n\n    /**\n     * @psalm-assert callable $callable\n     *\n     * @param Closure|callable $callable\n     *\n     * @return Closure|callable-string\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function notStatic(mixed $callable, string $message = ''): Closure|string\n    {\n        static::isCallable($callable, $message);\n\n        $callable = static::callableToClosure($callable);\n\n        $reflection = new ReflectionFunction($callable);\n\n        if ($reflection->isStatic()) {\n            static::reportInvalidArgument(\n                $message ?: 'Closure is not static.'\n            );\n        }\n\n        return $callable;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @template T\n     *\n     * @psalm-assert array<string, T> $array\n     * @psalm-assert !empty $array\n     *\n     * @param array<string, T> $array\n     *\n     * @return array<string, T>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function isNonEmptyMap(mixed $array, string $message = ''): array\n    {\n        static::isMap($array, $message);\n        static::notEmpty($array, $message);\n\n        return $array;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function uuid(mixed $value, string $message = ''): string\n    {\n        static::string($value, $message);\n\n        $originalValue = $value;\n        $value = \\str_replace(['urn:', 'uuid:', '{', '}'], '', $value);\n\n        // The nil UUID is special form of UUID that is specified to have all\n        // 128 bits set to zero.\n        if ('00000000-0000-0000-0000-000000000000' === $value) {\n            return $originalValue;\n        }\n\n        if (!\\preg_match('/^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$/D', $value)) {\n            static::reportInvalidArgument(\\sprintf(\n                $message ?: 'Value %s is not a valid UUID.',\n                static::valueToString($value)\n            ));\n        }\n\n        return $originalValue;\n    }\n\n    /**\n     * @psalm-param class-string<Throwable> $class\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function throws(mixed $expression, string $class = Throwable::class, string $message = ''): callable\n    {\n        static::string($class);\n        static::isCallable($expression);\n\n        $actual = 'none';\n\n        try {\n            $expression();\n        } catch (Throwable $e) {\n            $actual = \\get_class($e);\n            if ($e instanceof $class) {\n                return $expression;\n            }\n        }\n\n        static::reportInvalidArgument($message ?: \\sprintf(\n            'Expected to throw \"%s\", got \"%s\"',\n            $class,\n            $actual\n        ));\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return Closure|callable-string\n     */\n    protected static function callableToClosure(callable $callable): Closure|string\n    {\n        if (\\is_string($callable) && \\function_exists($callable)) {\n            return $callable;\n        }\n\n        if ($callable instanceof Closure) {\n            return $callable;\n        }\n\n        return $callable(...);\n    }\n\n    /**\n     * @psalm-pure\n     */\n    protected static function valueToString(mixed $value): string\n    {\n        if (null === $value) {\n            return 'null';\n        }\n\n        if (true === $value) {\n            return 'true';\n        }\n\n        if (false === $value) {\n            return 'false';\n        }\n\n        if (\\is_array($value)) {\n            return 'array';\n        }\n\n        if (\\is_object($value)) {\n            if (\\method_exists($value, '__toString')) {\n                return \\get_class($value).': '.self::valueToString($value->__toString());\n            }\n\n            if ($value instanceof DateTime || $value instanceof DateTimeImmutable) {\n                return \\get_class($value).': '.self::valueToString($value->format('c'));\n            }\n\n            if (\\enum_exists(\\get_class($value))) {\n                return \\get_class($value).'::'.$value->name;\n            }\n\n            return \\get_class($value);\n        }\n\n        if (\\is_resource($value)) {\n            return 'resource';\n        }\n\n        if (\\is_string($value)) {\n            return '\"'.$value.'\"';\n        }\n\n        return (string) $value;\n    }\n\n    /**\n     * @psalm-pure\n     */\n    protected static function typeToString(mixed $value): string\n    {\n        return \\is_object($value) ? \\get_class($value) : \\gettype($value);\n    }\n\n    protected static function strlen(string $value): int\n    {\n        if (!\\function_exists('mb_detect_encoding')) {\n            return \\strlen($value);\n        }\n\n        if (false === $encoding = \\mb_detect_encoding($value)) {\n            return \\strlen($value);\n        }\n\n        return \\mb_strlen($value, $encoding);\n    }\n\n    /**\n     * @psalm-pure this method is not supposed to perform side effects\n     *\n     * @throws InvalidArgumentException\n     */\n    protected static function reportInvalidArgument(string $message): never\n    {\n        throw new InvalidArgumentException($message);\n    }\n\n    private function __construct()\n    {\n    }\n}\n"
  },
  {
    "path": "src/InvalidArgumentException.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n/*\n * This file is part of the webmozart/assert package.\n *\n * (c) Bernhard Schussek <bschussek@gmail.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Webmozart\\Assert;\n\nclass InvalidArgumentException extends \\InvalidArgumentException\n{\n}\n"
  },
  {
    "path": "src/Mixin.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert;\n\nuse ArrayAccess;\nuse Countable;\nuse Throwable;\n\n/**\n * This trait provides nullOr*, all* and allNullOr* variants of assertion base methods.\n * Do not use this trait directly: it will change, and is not designed for reuse.\n */\ntrait Mixin\n{\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert string|null $value\n     *\n     * @return string|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrString(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::string($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<string> $value\n     *\n     * @return iterable<string>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allString(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::string($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<string|null> $value\n     *\n     * @return iterable<string|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrString(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::string($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert non-empty-string|null $value\n     *\n     * @return non-empty-string|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrStringNotEmpty(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::stringNotEmpty($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<non-empty-string> $value\n     *\n     * @return iterable<non-empty-string>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allStringNotEmpty(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::stringNotEmpty($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<non-empty-string|null> $value\n     *\n     * @return iterable<non-empty-string|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrStringNotEmpty(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::stringNotEmpty($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert int|null $value\n     *\n     * @return int|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrInteger(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::integer($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<int> $value\n     *\n     * @return iterable<int>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allInteger(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::integer($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<int|null> $value\n     *\n     * @return iterable<int|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrInteger(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::integer($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert numeric|null $value\n     *\n     * @return numeric|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrIntegerish(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::integerish($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<numeric> $value\n     *\n     * @return iterable<numeric>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allIntegerish(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::integerish($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<numeric|null> $value\n     *\n     * @return iterable<numeric|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrIntegerish(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::integerish($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert positive-int|null $value\n     *\n     * @return positive-int|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrPositiveInteger(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::positiveInteger($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<positive-int> $value\n     *\n     * @return iterable<positive-int>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allPositiveInteger(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::positiveInteger($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<positive-int|null> $value\n     *\n     * @return iterable<positive-int|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrPositiveInteger(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::positiveInteger($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert non-negative-int|null $value\n     *\n     * @return non-negative-int|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrNotNegativeInteger(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::notNegativeInteger($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<non-negative-int> $value\n     *\n     * @return iterable<non-negative-int>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNotNegativeInteger(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::notNegativeInteger($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<non-negative-int|null> $value\n     *\n     * @return iterable<non-negative-int|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrNotNegativeInteger(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::notNegativeInteger($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert negative-int|null $value\n     *\n     * @return negative-int|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrNegativeInteger(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::negativeInteger($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<negative-int> $value\n     *\n     * @return iterable<negative-int>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNegativeInteger(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::negativeInteger($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<negative-int|null> $value\n     *\n     * @return iterable<negative-int|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrNegativeInteger(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::negativeInteger($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert float|null $value\n     *\n     * @return float|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrFloat(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::float($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<float> $value\n     *\n     * @return iterable<float>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allFloat(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::float($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<float|null> $value\n     *\n     * @return iterable<float|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrFloat(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::float($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert numeric|null $value\n     *\n     * @return numeric|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrNumeric(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::numeric($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<numeric> $value\n     *\n     * @return iterable<numeric>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNumeric(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::numeric($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<numeric|null> $value\n     *\n     * @return iterable<numeric|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrNumeric(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::numeric($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert positive-int|0|null $value\n     *\n     * @return positive-int|0|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrNatural(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::natural($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<positive-int|0> $value\n     *\n     * @return iterable<positive-int|0>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNatural(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::natural($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<positive-int|0|null> $value\n     *\n     * @return iterable<positive-int|0|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrNatural(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::natural($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert bool|null $value\n     *\n     * @return bool|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrBoolean(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::boolean($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<bool> $value\n     *\n     * @return iterable<bool>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allBoolean(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::boolean($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<bool|null> $value\n     *\n     * @return iterable<bool|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrBoolean(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::boolean($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert scalar|null $value\n     *\n     * @return scalar|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrScalar(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::scalar($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<scalar> $value\n     *\n     * @return iterable<scalar>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allScalar(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::scalar($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<scalar|null> $value\n     *\n     * @return iterable<scalar|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrScalar(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::scalar($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert object|null $value\n     *\n     * @return object|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrObject(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::object($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<object> $value\n     *\n     * @return iterable<object>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allObject(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::object($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<object|null> $value\n     *\n     * @return iterable<object|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrObject(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::object($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert object|string|null $value\n     *\n     * @return object|string|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrObjectish(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::objectish($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<object|string> $value\n     *\n     * @return iterable<object|string>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allObjectish(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::objectish($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<object|string|null> $value\n     *\n     * @return iterable<object|string|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrObjectish(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::objectish($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert resource|null $value\n     *\n     * @see https://www.php.net/manual/en/function.get-resource-type.php\n     *\n     * @return resource|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrResource(mixed $value, ?string $type = null, string $message = ''): mixed\n    {\n        null === $value || static::resource($value, $type, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<resource> $value\n     *\n     * @see https://www.php.net/manual/en/function.get-resource-type.php\n     *\n     * @return iterable<resource>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allResource(mixed $value, ?string $type = null, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::resource($entry, $type, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<resource|null> $value\n     *\n     * @see https://www.php.net/manual/en/function.get-resource-type.php\n     *\n     * @return iterable<resource|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrResource(mixed $value, ?string $type = null, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::resource($entry, $type, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert callable|null $value\n     *\n     * @return callable|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrIsCallable(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::isCallable($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<callable> $value\n     *\n     * @return iterable<callable>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allIsCallable(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::isCallable($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<callable|null> $value\n     *\n     * @return iterable<callable|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrIsCallable(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::isCallable($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert array|null $value\n     *\n     * @return array|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrIsArray(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::isArray($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<array> $value\n     *\n     * @return iterable<array>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allIsArray(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::isArray($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<array|null> $value\n     *\n     * @return iterable<array|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrIsArray(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::isArray($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert array|ArrayAccess|null $value\n     *\n     * @return array|ArrayAccess|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrIsArrayAccessible(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::isArrayAccessible($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<array|ArrayAccess> $value\n     *\n     * @return iterable<array|ArrayAccess>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allIsArrayAccessible(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::isArrayAccessible($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<array|ArrayAccess|null> $value\n     *\n     * @return iterable<array|ArrayAccess|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrIsArrayAccessible(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::isArrayAccessible($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert countable|null $value\n     *\n     * @return countable|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrIsCountable(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::isCountable($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<countable> $value\n     *\n     * @return iterable<countable>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allIsCountable(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::isCountable($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<countable|null> $value\n     *\n     * @return iterable<countable|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrIsCountable(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::isCountable($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable|null $value\n     *\n     * @return iterable|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrIsIterable(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::isIterable($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<iterable> $value\n     *\n     * @return iterable<iterable>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allIsIterable(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::isIterable($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<iterable|null> $value\n     *\n     * @return iterable<iterable|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrIsIterable(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::isIterable($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @template T of object\n     * @psalm-assert T|null $value\n     *\n     * @psalm-param class-string<T> $class\n     * @return T|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrIsInstanceOf(mixed $value, mixed $class, string $message = ''): mixed\n    {\n        null === $value || static::isInstanceOf($value, $class, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @template T of object\n     * @psalm-assert iterable<T> $value\n     *\n     * @psalm-param class-string<T> $class\n     * @return iterable<T>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allIsInstanceOf(mixed $value, mixed $class, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::isInstanceOf($entry, $class, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @template T of object\n     * @psalm-assert iterable<T|null> $value\n     *\n     * @psalm-param class-string<T> $class\n     * @return iterable<T|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrIsInstanceOf(mixed $value, mixed $class, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::isInstanceOf($entry, $class, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @template T of object\n     * @psalm-param class-string<T> $class\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrNotInstanceOf(mixed $value, mixed $class, string $message = ''): mixed\n    {\n        null === $value || static::notInstanceOf($value, $class, $message);\n\n        return $value;\n    }\n\n    /**\n     * @template T of object\n     * @psalm-param class-string<T> $class\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNotInstanceOf(mixed $value, mixed $class, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::notInstanceOf($entry, $class, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @template T of object\n     * @psalm-assert iterable<object|null> $value\n     *\n     * @psalm-param class-string<T> $class\n     * @return iterable<object|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrNotInstanceOf(mixed $value, mixed $class, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::notInstanceOf($entry, $class, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @template T of object\n     * @psalm-assert T|null $value\n     *\n     * @param T|null $value\n     *\n     * @return T|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrIsInstanceOfAny(mixed $value, mixed $classes, string $message = ''): mixed\n    {\n        null === $value || static::isInstanceOfAny($value, $classes, $message);\n\n        return $value;\n    }\n\n    /**\n     * @template T of object\n     * @psalm-assert iterable<T> $value\n     *\n     * @param iterable<T> $value\n     *\n     * @return iterable<T>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allIsInstanceOfAny(mixed $value, mixed $classes, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::isInstanceOfAny($entry, $classes, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @template T of object\n     * @psalm-assert iterable<T|null> $value\n     *\n     * @param iterable<T|null> $value\n     *\n     * @return iterable<T|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrIsInstanceOfAny(mixed $value, mixed $classes, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::isInstanceOfAny($entry, $classes, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @template T of object\n     * @psalm-assert T|class-string<T>|null $value\n     *\n     * @return T|class-string<T>|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrIsAOf(mixed $value, mixed $class, string $message = ''): mixed\n    {\n        null === $value || static::isAOf($value, $class, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @template T of object\n     * @psalm-assert iterable<T|class-string<T>> $value\n     *\n     * @return iterable<T|class-string<T>>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allIsAOf(mixed $value, mixed $class, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::isAOf($entry, $class, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @template T of object\n     * @psalm-assert iterable<T|class-string<T>|null> $value\n     *\n     * @return iterable<T|class-string<T>|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrIsAOf(mixed $value, mixed $class, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::isAOf($entry, $class, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @template T\n     *\n     * @param T|null $value\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrIsNotA(mixed $value, mixed $class, string $message = ''): mixed\n    {\n        null === $value || static::isNotA($value, $class, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @template T\n     *\n     * @param iterable<T> $value\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allIsNotA(mixed $value, mixed $class, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::isNotA($entry, $class, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @template T\n     * @psalm-assert iterable<object|class-string|null> $value\n     *\n     * @param iterable<T|null> $value\n     *\n     * @return iterable<object|class-string|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrIsNotA(mixed $value, mixed $class, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::isNotA($entry, $class, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @param object|string|null $value\n     * @param string[]           $classes\n     *\n     * @psalm-param array<class-string> $classes\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrIsAnyOf(mixed $value, mixed $classes, string $message = ''): mixed\n    {\n        null === $value || static::isAnyOf($value, $classes, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @param iterable<object|string> $value\n     * @param string[]                $classes\n     *\n     * @psalm-param array<class-string> $classes\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allIsAnyOf(mixed $value, mixed $classes, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::isAnyOf($entry, $classes, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @param iterable<object|string|null> $value\n     * @param string[]                     $classes\n     *\n     * @psalm-param array<class-string> $classes\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrIsAnyOf(mixed $value, mixed $classes, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::isAnyOf($entry, $classes, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert empty $value\n     *\n     * @return empty\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrIsEmpty(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::isEmpty($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<empty> $value\n     *\n     * @return iterable<empty>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allIsEmpty(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::isEmpty($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<empty|null> $value\n     *\n     * @return iterable<empty|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrIsEmpty(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::isEmpty($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrNotEmpty(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::notEmpty($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNotEmpty(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::notEmpty($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<!empty|null> $value\n     *\n     * @return iterable<!empty|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrNotEmpty(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::notEmpty($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<null> $value\n     *\n     * @return iterable<null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNull(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::null($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNotNull(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::notNull($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert true|null $value\n     *\n     * @return true|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrTrue(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::true($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<true> $value\n     *\n     * @return iterable<true>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allTrue(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::true($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<true|null> $value\n     *\n     * @return iterable<true|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrTrue(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::true($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert false|null $value\n     *\n     * @return false|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrFalse(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::false($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<false> $value\n     *\n     * @return iterable<false>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allFalse(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::false($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<false|null> $value\n     *\n     * @return iterable<false|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrFalse(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::false($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrNotFalse(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::notFalse($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNotFalse(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::notFalse($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<!false|null> $value\n     *\n     * @return iterable<!false|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrNotFalse(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::notFalse($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-param string|null $value\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrIp(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::ip($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-param iterable<string> $value\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allIp(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::ip($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-param iterable<string|null> $value\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrIp(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::ip($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-param string|null $value\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrIpv4(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::ipv4($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-param iterable<string> $value\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allIpv4(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::ipv4($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-param iterable<string|null> $value\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrIpv4(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::ipv4($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-param string|null $value\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrIpv6(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::ipv6($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-param iterable<string> $value\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allIpv6(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::ipv6($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-param iterable<string|null> $value\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrIpv6(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::ipv6($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-param string|null $value\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrEmail(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::email($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-param iterable<string> $value\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allEmail(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::email($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-param iterable<string|null> $value\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrEmail(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::email($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrUniqueValues(mixed $values, string $message = ''): mixed\n    {\n        null === $values || static::uniqueValues($values, $message);\n\n        return $values;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allUniqueValues(mixed $values, string $message = ''): mixed\n    {\n        static::isIterable($values);\n\n        foreach ($values as $entry) {\n            static::uniqueValues($entry, $message);\n        }\n\n        return $values;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrUniqueValues(mixed $values, string $message = ''): mixed\n    {\n        static::isIterable($values);\n\n        foreach ($values as $entry) {\n            null === $entry || static::uniqueValues($entry, $message);\n        }\n\n        return $values;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrEq(mixed $value, mixed $expect, string $message = ''): mixed\n    {\n        null === $value || static::eq($value, $expect, $message);\n\n        return $value;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allEq(mixed $value, mixed $expect, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::eq($entry, $expect, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrEq(mixed $value, mixed $expect, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::eq($entry, $expect, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrNotEq(mixed $value, mixed $expect, string $message = ''): mixed\n    {\n        null === $value || static::notEq($value, $expect, $message);\n\n        return $value;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNotEq(mixed $value, mixed $expect, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::notEq($entry, $expect, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrNotEq(mixed $value, mixed $expect, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::notEq($entry, $expect, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrSame(mixed $value, mixed $expect, string $message = ''): mixed\n    {\n        null === $value || static::same($value, $expect, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allSame(mixed $value, mixed $expect, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::same($entry, $expect, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrSame(mixed $value, mixed $expect, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::same($entry, $expect, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrNotSame(mixed $value, mixed $expect, string $message = ''): mixed\n    {\n        null === $value || static::notSame($value, $expect, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNotSame(mixed $value, mixed $expect, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::notSame($entry, $expect, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrNotSame(mixed $value, mixed $expect, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::notSame($entry, $expect, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrGreaterThan(mixed $value, mixed $limit, string $message = ''): mixed\n    {\n        null === $value || static::greaterThan($value, $limit, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allGreaterThan(mixed $value, mixed $limit, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::greaterThan($entry, $limit, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrGreaterThan(mixed $value, mixed $limit, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::greaterThan($entry, $limit, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrGreaterThanEq(mixed $value, mixed $limit, string $message = ''): mixed\n    {\n        null === $value || static::greaterThanEq($value, $limit, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allGreaterThanEq(mixed $value, mixed $limit, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::greaterThanEq($entry, $limit, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrGreaterThanEq(mixed $value, mixed $limit, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::greaterThanEq($entry, $limit, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrLessThan(mixed $value, mixed $limit, string $message = ''): mixed\n    {\n        null === $value || static::lessThan($value, $limit, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allLessThan(mixed $value, mixed $limit, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::lessThan($entry, $limit, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrLessThan(mixed $value, mixed $limit, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::lessThan($entry, $limit, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrLessThanEq(mixed $value, mixed $limit, string $message = ''): mixed\n    {\n        null === $value || static::lessThanEq($value, $limit, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allLessThanEq(mixed $value, mixed $limit, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::lessThanEq($entry, $limit, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrLessThanEq(mixed $value, mixed $limit, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::lessThanEq($entry, $limit, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrRange(mixed $value, mixed $min, mixed $max, string $message = ''): mixed\n    {\n        null === $value || static::range($value, $min, $max, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allRange(mixed $value, mixed $min, mixed $max, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::range($entry, $min, $max, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrRange(mixed $value, mixed $min, mixed $max, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::range($entry, $min, $max, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrOneOf(mixed $value, mixed $values, string $message = ''): mixed\n    {\n        null === $value || static::oneOf($value, $values, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allOneOf(mixed $value, mixed $values, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::oneOf($entry, $values, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrOneOf(mixed $value, mixed $values, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::oneOf($entry, $values, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrInArray(mixed $value, mixed $values, string $message = ''): mixed\n    {\n        null === $value || static::inArray($value, $values, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allInArray(mixed $value, mixed $values, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::inArray($entry, $values, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrInArray(mixed $value, mixed $values, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::inArray($entry, $values, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrNotOneOf(mixed $value, mixed $values, string $message = ''): mixed\n    {\n        null === $value || static::notOneOf($value, $values, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNotOneOf(mixed $value, mixed $values, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::notOneOf($entry, $values, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrNotOneOf(mixed $value, mixed $values, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::notOneOf($entry, $values, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrNotInArray(mixed $value, mixed $values, string $message = ''): mixed\n    {\n        null === $value || static::notInArray($value, $values, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNotInArray(mixed $value, mixed $values, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::notInArray($entry, $values, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrNotInArray(mixed $value, mixed $values, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::notInArray($entry, $values, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrContains(mixed $value, mixed $subString, string $message = ''): mixed\n    {\n        null === $value || static::contains($value, $subString, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allContains(mixed $value, mixed $subString, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::contains($entry, $subString, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrContains(mixed $value, mixed $subString, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::contains($entry, $subString, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrNotContains(mixed $value, mixed $subString, string $message = ''): mixed\n    {\n        null === $value || static::notContains($value, $subString, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNotContains(mixed $value, mixed $subString, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::notContains($entry, $subString, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrNotContains(mixed $value, mixed $subString, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::notContains($entry, $subString, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrNotWhitespaceOnly(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::notWhitespaceOnly($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNotWhitespaceOnly(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::notWhitespaceOnly($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrNotWhitespaceOnly(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::notWhitespaceOnly($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrStartsWith(mixed $value, mixed $prefix, string $message = ''): mixed\n    {\n        null === $value || static::startsWith($value, $prefix, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allStartsWith(mixed $value, mixed $prefix, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::startsWith($entry, $prefix, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrStartsWith(mixed $value, mixed $prefix, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::startsWith($entry, $prefix, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrNotStartsWith(mixed $value, mixed $prefix, string $message = ''): mixed\n    {\n        null === $value || static::notStartsWith($value, $prefix, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNotStartsWith(mixed $value, mixed $prefix, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::notStartsWith($entry, $prefix, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrNotStartsWith(mixed $value, mixed $prefix, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::notStartsWith($entry, $prefix, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrStartsWithLetter(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::startsWithLetter($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allStartsWithLetter(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::startsWithLetter($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrStartsWithLetter(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::startsWithLetter($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrEndsWith(mixed $value, mixed $suffix, string $message = ''): mixed\n    {\n        null === $value || static::endsWith($value, $suffix, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allEndsWith(mixed $value, mixed $suffix, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::endsWith($entry, $suffix, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrEndsWith(mixed $value, mixed $suffix, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::endsWith($entry, $suffix, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrNotEndsWith(mixed $value, mixed $suffix, string $message = ''): mixed\n    {\n        null === $value || static::notEndsWith($value, $suffix, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNotEndsWith(mixed $value, mixed $suffix, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::notEndsWith($entry, $suffix, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrNotEndsWith(mixed $value, mixed $suffix, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::notEndsWith($entry, $suffix, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrRegex(mixed $value, mixed $pattern, string $message = ''): mixed\n    {\n        null === $value || static::regex($value, $pattern, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allRegex(mixed $value, mixed $pattern, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::regex($entry, $pattern, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrRegex(mixed $value, mixed $pattern, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::regex($entry, $pattern, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrNotRegex(mixed $value, mixed $pattern, string $message = ''): mixed\n    {\n        null === $value || static::notRegex($value, $pattern, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNotRegex(mixed $value, mixed $pattern, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::notRegex($entry, $pattern, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrNotRegex(mixed $value, mixed $pattern, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::notRegex($entry, $pattern, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrUnicodeLetters(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::unicodeLetters($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allUnicodeLetters(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::unicodeLetters($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrUnicodeLetters(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::unicodeLetters($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrAlpha(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::alpha($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allAlpha(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::alpha($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrAlpha(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::alpha($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrDigits(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::digits($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allDigits(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::digits($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrDigits(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::digits($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrAlnum(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::alnum($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allAlnum(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::alnum($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrAlnum(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::alnum($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert lowercase-string|null $value\n     *\n     * @return lowercase-string|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrLower(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::lower($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<lowercase-string> $value\n     *\n     * @return iterable<lowercase-string>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allLower(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::lower($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<lowercase-string|null> $value\n     *\n     * @return iterable<lowercase-string|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrLower(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::lower($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrUpper(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::upper($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allUpper(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::upper($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<!lowercase-string|null> $value\n     *\n     * @return iterable<!lowercase-string|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrUpper(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::upper($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrLength(mixed $value, mixed $length, string $message = ''): mixed\n    {\n        null === $value || static::length($value, $length, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allLength(mixed $value, mixed $length, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::length($entry, $length, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrLength(mixed $value, mixed $length, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::length($entry, $length, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrMinLength(mixed $value, mixed $min, string $message = ''): mixed\n    {\n        null === $value || static::minLength($value, $min, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allMinLength(mixed $value, mixed $min, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::minLength($entry, $min, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrMinLength(mixed $value, mixed $min, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::minLength($entry, $min, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrMaxLength(mixed $value, mixed $max, string $message = ''): mixed\n    {\n        null === $value || static::maxLength($value, $max, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allMaxLength(mixed $value, mixed $max, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::maxLength($entry, $max, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrMaxLength(mixed $value, mixed $max, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::maxLength($entry, $max, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrLengthBetween(mixed $value, mixed $min, mixed $max, string $message = ''): mixed\n    {\n        null === $value || static::lengthBetween($value, $min, $max, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allLengthBetween(mixed $value, mixed $min, mixed $max, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::lengthBetween($entry, $min, $max, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrLengthBetween(mixed $value, mixed $min, mixed $max, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::lengthBetween($entry, $min, $max, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrFileExists(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::fileExists($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allFileExists(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::fileExists($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrFileExists(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::fileExists($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrFile(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::file($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allFile(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::file($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrFile(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::file($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrDirectory(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::directory($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allDirectory(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::directory($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrDirectory(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::directory($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrReadable(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::readable($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allReadable(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::readable($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrReadable(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::readable($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrWritable(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::writable($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allWritable(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::writable($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrWritable(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::writable($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-assert class-string|null $value\n     *\n     * @return class-string|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrClassExists(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::classExists($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-assert iterable<class-string> $value\n     *\n     * @return iterable<class-string>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allClassExists(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::classExists($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-assert iterable<class-string|null> $value\n     *\n     * @return iterable<class-string|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrClassExists(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::classExists($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @template ExpectedType of object\n     * @psalm-assert class-string<ExpectedType>|null $value\n     *\n     * @param class-string<ExpectedType> $class\n     *\n     * @return class-string<ExpectedType>|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrSubclassOf(mixed $value, mixed $class, string $message = ''): mixed\n    {\n        null === $value || static::subclassOf($value, $class, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @template ExpectedType of object\n     * @psalm-assert iterable<class-string<ExpectedType>> $value\n     *\n     * @param class-string<ExpectedType> $class\n     *\n     * @return iterable<class-string<ExpectedType>>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allSubclassOf(mixed $value, mixed $class, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::subclassOf($entry, $class, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @template ExpectedType of object\n     * @psalm-assert iterable<class-string<ExpectedType>|null> $value\n     *\n     * @param class-string<ExpectedType> $class\n     *\n     * @return iterable<class-string<ExpectedType>|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrSubclassOf(mixed $value, mixed $class, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::subclassOf($entry, $class, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-assert class-string|null $value\n     *\n     * @return class-string|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrInterfaceExists(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::interfaceExists($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-assert iterable<class-string> $value\n     *\n     * @return iterable<class-string>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allInterfaceExists(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::interfaceExists($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-assert iterable<class-string|null> $value\n     *\n     * @return iterable<class-string|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrInterfaceExists(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::interfaceExists($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @template ExpectedType of object\n     * @psalm-assert class-string<ExpectedType>|ExpectedType|null $value\n     *\n     * @param class-string<ExpectedType>|ExpectedType|null $value\n     * @param class-string<ExpectedType>                   $interface\n     *\n     * @return class-string<ExpectedType>|ExpectedType|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrImplementsInterface(mixed $value, mixed $interface, string $message = ''): mixed\n    {\n        null === $value || static::implementsInterface($value, $interface, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @template ExpectedType of object\n     * @psalm-assert iterable<class-string<ExpectedType>|ExpectedType> $value\n     *\n     * @param iterable<class-string<ExpectedType>|ExpectedType> $value\n     * @param class-string<ExpectedType>                        $interface\n     *\n     * @return iterable<class-string<ExpectedType>|ExpectedType>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allImplementsInterface(mixed $value, mixed $interface, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::implementsInterface($entry, $interface, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @template ExpectedType of object\n     * @psalm-assert iterable<class-string<ExpectedType>|ExpectedType|null> $value\n     *\n     * @param iterable<class-string<ExpectedType>|ExpectedType|null> $value\n     * @param class-string<ExpectedType>                             $interface\n     *\n     * @return iterable<class-string<ExpectedType>|ExpectedType|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrImplementsInterface(mixed $value, mixed $interface, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::implementsInterface($entry, $interface, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @param string|object|null $classOrObject\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrPropertyExists(mixed $classOrObject, mixed $property, string $message = ''): mixed\n    {\n        null === $classOrObject || static::propertyExists($classOrObject, $property, $message);\n\n        return $classOrObject;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @param iterable<string|object> $classOrObject\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allPropertyExists(mixed $classOrObject, mixed $property, string $message = ''): mixed\n    {\n        static::isIterable($classOrObject);\n\n        foreach ($classOrObject as $entry) {\n            static::propertyExists($entry, $property, $message);\n        }\n\n        return $classOrObject;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @param iterable<string|object|null> $classOrObject\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrPropertyExists(mixed $classOrObject, mixed $property, string $message = ''): mixed\n    {\n        static::isIterable($classOrObject);\n\n        foreach ($classOrObject as $entry) {\n            null === $entry || static::propertyExists($entry, $property, $message);\n        }\n\n        return $classOrObject;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @param string|object|null $classOrObject\n     *\n     * @psalm-param class-string|object|null $classOrObject\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrPropertyNotExists(mixed $classOrObject, mixed $property, string $message = ''): mixed\n    {\n        null === $classOrObject || static::propertyNotExists($classOrObject, $property, $message);\n\n        return $classOrObject;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @param iterable<string|object> $classOrObject\n     *\n     * @psalm-param iterable<class-string|object> $classOrObject\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allPropertyNotExists(mixed $classOrObject, mixed $property, string $message = ''): mixed\n    {\n        static::isIterable($classOrObject);\n\n        foreach ($classOrObject as $entry) {\n            static::propertyNotExists($entry, $property, $message);\n        }\n\n        return $classOrObject;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @param iterable<string|object|null> $classOrObject\n     *\n     * @psalm-param iterable<class-string|object|null> $classOrObject\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrPropertyNotExists(mixed $classOrObject, mixed $property, string $message = ''): mixed\n    {\n        static::isIterable($classOrObject);\n\n        foreach ($classOrObject as $entry) {\n            null === $entry || static::propertyNotExists($entry, $property, $message);\n        }\n\n        return $classOrObject;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @param string|object|null $classOrObject\n     *\n     * @psalm-param class-string|object|null $classOrObject\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrMethodExists(mixed $classOrObject, mixed $method, string $message = ''): mixed\n    {\n        null === $classOrObject || static::methodExists($classOrObject, $method, $message);\n\n        return $classOrObject;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @param iterable<string|object> $classOrObject\n     *\n     * @psalm-param iterable<class-string|object> $classOrObject\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allMethodExists(mixed $classOrObject, mixed $method, string $message = ''): mixed\n    {\n        static::isIterable($classOrObject);\n\n        foreach ($classOrObject as $entry) {\n            static::methodExists($entry, $method, $message);\n        }\n\n        return $classOrObject;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @param iterable<string|object|null> $classOrObject\n     *\n     * @psalm-param iterable<class-string|object|null> $classOrObject\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrMethodExists(mixed $classOrObject, mixed $method, string $message = ''): mixed\n    {\n        static::isIterable($classOrObject);\n\n        foreach ($classOrObject as $entry) {\n            null === $entry || static::methodExists($entry, $method, $message);\n        }\n\n        return $classOrObject;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @param string|object|null $classOrObject\n     *\n     * @psalm-param class-string|object|null $classOrObject\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrMethodNotExists(mixed $classOrObject, mixed $method, string $message = ''): mixed\n    {\n        null === $classOrObject || static::methodNotExists($classOrObject, $method, $message);\n\n        return $classOrObject;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @param iterable<string|object> $classOrObject\n     *\n     * @psalm-param iterable<class-string|object> $classOrObject\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allMethodNotExists(mixed $classOrObject, mixed $method, string $message = ''): mixed\n    {\n        static::isIterable($classOrObject);\n\n        foreach ($classOrObject as $entry) {\n            static::methodNotExists($entry, $method, $message);\n        }\n\n        return $classOrObject;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @param iterable<string|object|null> $classOrObject\n     *\n     * @psalm-param iterable<class-string|object|null> $classOrObject\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrMethodNotExists(mixed $classOrObject, mixed $method, string $message = ''): mixed\n    {\n        static::isIterable($classOrObject);\n\n        foreach ($classOrObject as $entry) {\n            null === $entry || static::methodNotExists($entry, $method, $message);\n        }\n\n        return $classOrObject;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @param string|int $key\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrKeyExists(mixed $array, string|int $key, string $message = ''): mixed\n    {\n        null === $array || static::keyExists($array, $key, $message);\n\n        return $array;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @param string|int $key\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allKeyExists(mixed $array, string|int $key, string $message = ''): mixed\n    {\n        static::isIterable($array);\n\n        foreach ($array as $entry) {\n            static::keyExists($entry, $key, $message);\n        }\n\n        return $array;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @param string|int $key\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrKeyExists(mixed $array, string|int $key, string $message = ''): mixed\n    {\n        static::isIterable($array);\n\n        foreach ($array as $entry) {\n            null === $entry || static::keyExists($entry, $key, $message);\n        }\n\n        return $array;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @param string|int $key\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrKeyNotExists(mixed $array, string|int $key, string $message = ''): mixed\n    {\n        null === $array || static::keyNotExists($array, $key, $message);\n\n        return $array;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @param string|int $key\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allKeyNotExists(mixed $array, string|int $key, string $message = ''): mixed\n    {\n        static::isIterable($array);\n\n        foreach ($array as $entry) {\n            static::keyNotExists($entry, $key, $message);\n        }\n\n        return $array;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @param string|int $key\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrKeyNotExists(mixed $array, string|int $key, string $message = ''): mixed\n    {\n        static::isIterable($array);\n\n        foreach ($array as $entry) {\n            null === $entry || static::keyNotExists($entry, $key, $message);\n        }\n\n        return $array;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert array-key|null $value\n     *\n     * @return array-key|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrValidArrayKey(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::validArrayKey($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<array-key> $value\n     *\n     * @return iterable<array-key>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allValidArrayKey(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::validArrayKey($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<array-key|null> $value\n     *\n     * @return iterable<array-key|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrValidArrayKey(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::validArrayKey($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrCount(mixed $array, mixed $number, string $message = ''): mixed\n    {\n        null === $array || static::count($array, $number, $message);\n\n        return $array;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allCount(mixed $array, mixed $number, string $message = ''): mixed\n    {\n        static::isIterable($array);\n\n        foreach ($array as $entry) {\n            static::count($entry, $number, $message);\n        }\n\n        return $array;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrCount(mixed $array, mixed $number, string $message = ''): mixed\n    {\n        static::isIterable($array);\n\n        foreach ($array as $entry) {\n            null === $entry || static::count($entry, $number, $message);\n        }\n\n        return $array;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrMinCount(mixed $array, mixed $min, string $message = ''): mixed\n    {\n        null === $array || static::minCount($array, $min, $message);\n\n        return $array;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allMinCount(mixed $array, mixed $min, string $message = ''): mixed\n    {\n        static::isIterable($array);\n\n        foreach ($array as $entry) {\n            static::minCount($entry, $min, $message);\n        }\n\n        return $array;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrMinCount(mixed $array, mixed $min, string $message = ''): mixed\n    {\n        static::isIterable($array);\n\n        foreach ($array as $entry) {\n            null === $entry || static::minCount($entry, $min, $message);\n        }\n\n        return $array;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrMaxCount(mixed $array, mixed $max, string $message = ''): mixed\n    {\n        null === $array || static::maxCount($array, $max, $message);\n\n        return $array;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allMaxCount(mixed $array, mixed $max, string $message = ''): mixed\n    {\n        static::isIterable($array);\n\n        foreach ($array as $entry) {\n            static::maxCount($entry, $max, $message);\n        }\n\n        return $array;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrMaxCount(mixed $array, mixed $max, string $message = ''): mixed\n    {\n        static::isIterable($array);\n\n        foreach ($array as $entry) {\n            null === $entry || static::maxCount($entry, $max, $message);\n        }\n\n        return $array;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrCountBetween(mixed $array, mixed $min, mixed $max, string $message = ''): mixed\n    {\n        null === $array || static::countBetween($array, $min, $max, $message);\n\n        return $array;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allCountBetween(mixed $array, mixed $min, mixed $max, string $message = ''): mixed\n    {\n        static::isIterable($array);\n\n        foreach ($array as $entry) {\n            static::countBetween($entry, $min, $max, $message);\n        }\n\n        return $array;\n    }\n\n    /**\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrCountBetween(mixed $array, mixed $min, mixed $max, string $message = ''): mixed\n    {\n        static::isIterable($array);\n\n        foreach ($array as $entry) {\n            null === $entry || static::countBetween($entry, $min, $max, $message);\n        }\n\n        return $array;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert list<mixed>|null $array\n     *\n     * @return list<mixed>|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrIsList(mixed $array, string $message = ''): mixed\n    {\n        null === $array || static::isList($array, $message);\n\n        return $array;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<list<mixed>> $array\n     *\n     * @return iterable<list<mixed>>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allIsList(mixed $array, string $message = ''): mixed\n    {\n        static::isIterable($array);\n\n        foreach ($array as $entry) {\n            static::isList($entry, $message);\n        }\n\n        return $array;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<list<mixed>|null> $array\n     *\n     * @return iterable<list<mixed>|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrIsList(mixed $array, string $message = ''): mixed\n    {\n        static::isIterable($array);\n\n        foreach ($array as $entry) {\n            null === $entry || static::isList($entry, $message);\n        }\n\n        return $array;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert non-empty-list<mixed>|null $array\n     *\n     * @return non-empty-list<mixed>|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrIsNonEmptyList(mixed $array, string $message = ''): mixed\n    {\n        null === $array || static::isNonEmptyList($array, $message);\n\n        return $array;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<non-empty-list<mixed>> $array\n     *\n     * @return iterable<non-empty-list<mixed>>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allIsNonEmptyList(mixed $array, string $message = ''): mixed\n    {\n        static::isIterable($array);\n\n        foreach ($array as $entry) {\n            static::isNonEmptyList($entry, $message);\n        }\n\n        return $array;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @psalm-assert iterable<non-empty-list<mixed>|null> $array\n     *\n     * @return iterable<non-empty-list<mixed>|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrIsNonEmptyList(mixed $array, string $message = ''): mixed\n    {\n        static::isIterable($array);\n\n        foreach ($array as $entry) {\n            null === $entry || static::isNonEmptyList($entry, $message);\n        }\n\n        return $array;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @template T\n     * @psalm-assert array<string, T>|null $array\n     *\n     * @param mixed|array<array-key, T>|null $array\n     *\n     * @return array<string, T>|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrIsMap(mixed $array, string $message = ''): mixed\n    {\n        null === $array || static::isMap($array, $message);\n\n        return $array;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @template T\n     * @psalm-assert iterable<array<string, T>> $array\n     *\n     * @param iterable<mixed|array<array-key, T>> $array\n     *\n     * @return iterable<array<string, T>>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allIsMap(mixed $array, string $message = ''): mixed\n    {\n        static::isIterable($array);\n\n        foreach ($array as $entry) {\n            static::isMap($entry, $message);\n        }\n\n        return $array;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @template T\n     * @psalm-assert iterable<array<string, T>|null> $array\n     *\n     * @param iterable<mixed|array<array-key, T>|null> $array\n     *\n     * @return iterable<array<string, T>|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrIsMap(mixed $array, string $message = ''): mixed\n    {\n        static::isIterable($array);\n\n        foreach ($array as $entry) {\n            null === $entry || static::isMap($entry, $message);\n        }\n\n        return $array;\n    }\n\n    /**\n     * @psalm-assert callable|null $callable\n     *\n     * @param Closure|callable|null $callable\n     *\n     * @return callable|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrIsStatic(mixed $callable, string $message = ''): mixed\n    {\n        null === $callable || static::isStatic($callable, $message);\n\n        return $callable;\n    }\n\n    /**\n     * @psalm-assert iterable<callable> $callable\n     *\n     * @param iterable<Closure|callable> $callable\n     *\n     * @return iterable<callable>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allIsStatic(mixed $callable, string $message = ''): mixed\n    {\n        static::isIterable($callable);\n\n        foreach ($callable as $entry) {\n            static::isStatic($entry, $message);\n        }\n\n        return $callable;\n    }\n\n    /**\n     * @psalm-assert iterable<callable|null> $callable\n     *\n     * @param iterable<Closure|callable|null> $callable\n     *\n     * @return iterable<callable|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrIsStatic(mixed $callable, string $message = ''): mixed\n    {\n        static::isIterable($callable);\n\n        foreach ($callable as $entry) {\n            null === $entry || static::isStatic($entry, $message);\n        }\n\n        return $callable;\n    }\n\n    /**\n     * @psalm-assert callable|null $callable\n     *\n     * @param Closure|callable|null $callable\n     *\n     * @return callable|null\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrNotStatic(mixed $callable, string $message = ''): mixed\n    {\n        null === $callable || static::notStatic($callable, $message);\n\n        return $callable;\n    }\n\n    /**\n     * @psalm-assert iterable<callable> $callable\n     *\n     * @param iterable<Closure|callable> $callable\n     *\n     * @return iterable<callable>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNotStatic(mixed $callable, string $message = ''): mixed\n    {\n        static::isIterable($callable);\n\n        foreach ($callable as $entry) {\n            static::notStatic($entry, $message);\n        }\n\n        return $callable;\n    }\n\n    /**\n     * @psalm-assert iterable<callable|null> $callable\n     *\n     * @param iterable<Closure|callable|null> $callable\n     *\n     * @return iterable<callable|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrNotStatic(mixed $callable, string $message = ''): mixed\n    {\n        static::isIterable($callable);\n\n        foreach ($callable as $entry) {\n            null === $entry || static::notStatic($entry, $message);\n        }\n\n        return $callable;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @template T\n     *\n     * @param array<string, T>|null $array\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrIsNonEmptyMap(mixed $array, string $message = ''): mixed\n    {\n        null === $array || static::isNonEmptyMap($array, $message);\n\n        return $array;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @template T\n     *\n     * @param iterable<array<string, T>> $array\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allIsNonEmptyMap(mixed $array, string $message = ''): mixed\n    {\n        static::isIterable($array);\n\n        foreach ($array as $entry) {\n            static::isNonEmptyMap($entry, $message);\n        }\n\n        return $array;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @template T\n     * @psalm-assert iterable<array<string, T>|null> $array\n     * @psalm-assert iterable<!empty|null> $array\n     *\n     * @param iterable<array<string, T>|null> $array\n     *\n     * @return iterable<!empty|null>\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrIsNonEmptyMap(mixed $array, string $message = ''): mixed\n    {\n        static::isIterable($array);\n\n        foreach ($array as $entry) {\n            null === $entry || static::isNonEmptyMap($entry, $message);\n        }\n\n        return $array;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrUuid(mixed $value, string $message = ''): mixed\n    {\n        null === $value || static::uuid($value, $message);\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allUuid(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            static::uuid($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-pure\n     *\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrUuid(mixed $value, string $message = ''): iterable\n    {\n        static::isIterable($value);\n\n        foreach ($value as $entry) {\n            null === $entry || static::uuid($entry, $message);\n        }\n\n        return $value;\n    }\n\n    /**\n     * @psalm-param class-string<Throwable> $class\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function nullOrThrows(mixed $expression, string $class = 'Throwable', string $message = ''): mixed\n    {\n        null === $expression || static::throws($expression, $class, $message);\n\n        return $expression;\n    }\n\n    /**\n     * @psalm-param class-string<Throwable> $class\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allThrows(mixed $expression, string $class = 'Throwable', string $message = ''): mixed\n    {\n        static::isIterable($expression);\n\n        foreach ($expression as $entry) {\n            static::throws($entry, $class, $message);\n        }\n\n        return $expression;\n    }\n\n    /**\n     * @psalm-param class-string<Throwable> $class\n     * @return mixed\n     *\n     * @throws InvalidArgumentException\n     */\n    public static function allNullOrThrows(mixed $expression, string $class = 'Throwable', string $message = ''): mixed\n    {\n        static::isIterable($expression);\n\n        foreach ($expression as $entry) {\n            null === $entry || static::throws($entry, $class, $message);\n        }\n\n        return $expression;\n    }\n}\n"
  },
  {
    "path": "tests/AssertTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\n/*\n * This file is part of the webmozart/assert package.\n *\n * (c) Bernhard Schussek <bschussek@gmail.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Webmozart\\Assert\\Tests;\n\nuse ArrayIterator;\nuse ArrayObject;\nuse DateTime;\nuse DateTimeImmutable;\nuse Error;\nuse Exception;\nuse LogicException;\nuse PHPUnit\\Framework\\Attributes\\DataProvider;\nuse PHPUnit\\Framework\\TestCase;\nuse RuntimeException;\nuse SimpleXMLElement;\nuse stdClass;\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @since  1.0\n *\n * @author Bernhard Schussek <bschussek@gmail.com>\n */\nclass AssertTest extends TestCase\n{\n    private const SKIP_MIXIN_ASSERTION_TESTS = [\n        'isInitialized',\n    ];\n\n    public static function getResource()\n    {\n        static $resource;\n\n        return $resource ??= tmpfile();\n    }\n\n    public static function getTests(): array\n    {\n        $nanList = ['key' => 2, NAN];\n        unset($nanList['key']);\n\n        $normalList = ['foo' => 'b', 3];\n        unset($normalList['foo']);\n\n        return [\n            ['string', ['value'], true],\n            ['string', [''], true],\n            ['string', [1234], false],\n            ['stringNotEmpty', ['value'], true],\n            ['stringNotEmpty', ['0'], true],\n            ['stringNotEmpty', [''], false],\n            ['stringNotEmpty', [1234], false],\n            ['integer', [123], true],\n            ['integer', ['123'], false],\n            ['integer', [1.0], false],\n            ['integer', [1.23], false],\n            ['integerish', [1.0], true],\n            ['integerish', [1.23], false],\n            ['integerish', [123], true],\n            ['integerish', ['123'], true],\n            ['positiveInteger', [123], true],\n            ['positiveInteger', [1], true],\n            ['positiveInteger', [-123], false],\n            ['positiveInteger', [0], false],\n            ['positiveInteger', [0.0], false],\n            ['positiveInteger', ['123'], false],\n            ['positiveInteger', ['-123'], false],\n            ['positiveInteger', ['0'], false],\n            ['positiveInteger', [1.0], false],\n            ['positiveInteger', [1.23], false],\n            ['notNegativeInteger', [123], true],\n            ['notNegativeInteger', [1], true],\n            ['notNegativeInteger', [-123], false],\n            ['notNegativeInteger', [0], true],\n            ['notNegativeInteger', [0.0], false],\n            ['notNegativeInteger', ['123'], false],\n            ['notNegativeInteger', ['-123'], false],\n            ['notNegativeInteger', ['0'], false],\n            ['notNegativeInteger', [1.0], false],\n            ['notNegativeInteger', [1.23], false],\n            ['negativeInteger', [123], false],\n            ['negativeInteger', [1], false],\n            ['negativeInteger', [-123], true],\n            ['negativeInteger', [0], false],\n            ['negativeInteger', [0.0], false],\n            ['negativeInteger', ['123'], false],\n            ['negativeInteger', ['-123'], false],\n            ['negativeInteger', ['0'], false],\n            ['negativeInteger', [1.0], false],\n            ['negativeInteger', [1.23], false],\n            ['float', [1.0], true],\n            ['float', [1.23], true],\n            ['float', [123], false],\n            ['float', ['123'], false],\n            ['numeric', [1.0], true],\n            ['numeric', [1.23], true],\n            ['numeric', [123], true],\n            ['numeric', ['123'], true],\n            ['numeric', ['foo'], false],\n            ['natural', [0], true],\n            ['natural', [1], true],\n            ['natural', [-1], false],\n            ['natural', ['1'], false],\n            ['natural', [1.0], false],\n            ['natural', [1.23], false],\n            ['boolean', [true], true],\n            ['boolean', [false], true],\n            ['boolean', [1], false],\n            ['boolean', ['1'], false],\n            ['scalar', ['1'], true],\n            ['scalar', [123], true],\n            ['scalar', [true], true],\n            ['scalar', [null], false],\n            ['scalar', [[]], false],\n            ['scalar', [new stdClass()], false],\n            ['object', [new stdClass()], true],\n            ['object', [new RuntimeException()], true],\n            ['object', [null], false],\n            ['object', [true], false],\n            ['object', [1], false],\n            ['object', [[]], false],\n            ['objectish', [new stdClass()], true],\n            ['objectish', [new RuntimeException()], true],\n            ['objectish', [null], false],\n            ['objectish', [true], false],\n            ['objectish', [1], false],\n            ['objectish', [[]], false],\n            ['resource', [self::getResource()], true],\n            ['resource', [self::getResource(), 'stream'], true],\n            ['resource', [self::getResource(), 'other'], false],\n            ['resource', [1], false],\n            ['isInitialized', [new class {\n                public mixed $a = null;\n            }, 'a'], true],\n            ['isInitialized', [new class {\n                public mixed $a;\n            }, 'a'], false],\n            ['isInitialized', [new class {\n                public mixed $a;\n                public mixed $b = true;\n            }, 'a'], false],\n            ['isInitialized', [new class {\n                public mixed $a;\n                public mixed $b = true;\n            }, 'b'], true],\n            ['isCallable', ['strlen'], true],\n            ['isCallable', [[self::class, 'getTests']], true],\n            ['isCallable', [function () {}], true],\n            ['isCallable', [1234], false],\n            ['isCallable', ['foobar'], false],\n            ['isArray', [[]], true],\n            ['isArray', [[1, 2, 3]], true],\n            ['isArray', [new ArrayIterator([])], false],\n            ['isArray', [123], false],\n            ['isArray', [new stdClass()], false],\n            ['isArrayAccessible', [[]], true],\n            ['isArrayAccessible', [[1, 2, 3]], true],\n            ['isArrayAccessible', [new ArrayObject([])], true],\n            ['isArrayAccessible', [123], false],\n            ['isArrayAccessible', [new stdClass()], false],\n            ['isCountable', [[]], true],\n            ['isCountable', [[1, 2]], true],\n            ['isCountable', [new ArrayIterator([])], true],\n            ['isCountable', [new stdClass()], false],\n            ['isCountable', [new SimpleXMLElement('<foo>bar</foo>')], true],\n            ['isCountable', ['abcd'], false],\n            ['isCountable', [123], false],\n            ['isIterable', [[]], true],\n            ['isIterable', [[1, 2, 3]], true],\n            ['isIterable', [new ArrayIterator([])], true],\n            ['isIterable', [123], false],\n            ['isIterable', [new stdClass()], false],\n            ['isInstanceOf', [new stdClass(), 'stdClass'], true],\n            ['isInstanceOf', [new Exception(), 'stdClass'], false],\n            ['isInstanceOf', [123, 'stdClass'], false],\n            ['isInstanceOf', [[], 'stdClass'], false],\n            ['isInstanceOf', [null, 'stdClass'], false],\n            ['notInstanceOf', [new stdClass(), 'stdClass'], false],\n            ['notInstanceOf', [new Exception(), 'stdClass'], true],\n            ['notInstanceOf', [123, 'stdClass'], false],\n            ['notInstanceOf', [[], 'stdClass'], false],\n            ['notInstanceOf', [null, 'stdClass'], false],\n            ['isInstanceOfAny', [new ArrayIterator(), ['Iterator', 'ArrayAccess']], true],\n            ['isInstanceOfAny', [new Exception(), ['Exception', 'Countable']], true],\n            ['isInstanceOfAny', [new Exception(), ['ArrayAccess', 'Countable']], false],\n            ['isInstanceOfAny', [123, ['stdClass']], false],\n            ['isInstanceOfAny', [[], ['stdClass']], false],\n            ['isAOf', ['stdClass', 'stdClass'], true],\n            ['isAOf', ['stdClass', 123], false],\n            ['isAOf', ['Iterator', 'ArrayIterator'], false],\n            ['isAOf', [123, 'Iterator'], false],\n            ['isAOf', [[], 'Iterator'], false],\n            ['isAnyOf', ['ArrayIterator', ['Iterator', 'ArrayAccess']], true],\n            ['isAnyOf', ['ArrayIterator', [123]], false],\n            ['isAnyOf', ['Exception', ['Exception', 'Countable']], true],\n            ['isAnyOf', ['Exception', ['ArrayAccess', 'Countable']], false],\n            ['isAnyOf', [123, ['stdClass']], false],\n            ['isAnyOf', [[], ['stdClass']], false],\n            ['isNotA', ['stdClass', 'stdClass'], false],\n            ['isNotA', ['stdClass', 123], false],\n            ['isNotA', [[], 'Iterator'], false],\n            ['true', [true], true],\n            ['true', [false], false],\n            ['true', [1], false],\n            ['true', [null], false],\n            ['false', [false], true],\n            ['false', [true], false],\n            ['false', [1], false],\n            ['false', [0], false],\n            ['false', [null], false],\n            ['notFalse', [false], false],\n            ['notFalse', [true], true],\n            ['notFalse', [1], true],\n            ['notFalse', [0], true],\n            ['notFalse', [null], true],\n            ['null', [null], true],\n            ['null', [false], false],\n            ['null', [0], false],\n            ['notNull', [false], true],\n            ['notNull', [0], true],\n            ['notNull', [null], false],\n            ['isEmpty', [null], true],\n            ['isEmpty', [false], true],\n            ['isEmpty', [0], true],\n            ['isEmpty', [''], true],\n            ['isEmpty', [1], false],\n            ['isEmpty', ['a'], false],\n            ['notEmpty', [1], true],\n            ['notEmpty', ['a'], true],\n            ['notEmpty', [null], false],\n            ['notEmpty', [false], false],\n            ['notEmpty', [0], false],\n            ['notEmpty', [''], false],\n            ['eq', [1, 1], true],\n            ['eq', [1, '1'], true],\n            ['eq', [1, true], true],\n            ['eq', [1, 0], false],\n            ['notEq', [1, 0], true],\n            ['notEq', [1, 1], false],\n            ['notEq', [1, '1'], false],\n            ['notEq', [1, true], false],\n            ['same', [1, 1], true],\n            ['same', [1, '1'], false],\n            ['same', [1, true], false],\n            ['same', [1, 0], false],\n            ['notSame', [1, 0], true],\n            ['notSame', [1, 1], false],\n            ['notSame', [1, '1'], true],\n            ['notSame', [1, true], true],\n            ['greaterThan', [1, 0], true],\n            ['greaterThan', [0, 0], false],\n            ['greaterThanEq', [2, 1], true],\n            ['greaterThanEq', [1, 1], true],\n            ['greaterThanEq', [0, 1], false],\n            ['lessThan', [0, 1], true],\n            ['lessThan', [1, 1], false],\n            ['lessThanEq', [0, 1], true],\n            ['lessThanEq', [1, 1], true],\n            ['lessThanEq', [2, 1], false],\n            ['range', [1, 1, 2], true],\n            ['range', [2, 1, 2], true],\n            ['range', [0, 1, 2], false],\n            ['range', [3, 1, 2], false],\n            ['oneOf', [1, [1, 2, 3]], true],\n            ['oneOf', [1, ['1', '2', '3']], false],\n            ['notOneOf', [1, [1, 2, 3]], false],\n            ['notOneOf', [1, ['1', '2', '3']], true],\n            ['inArray', [1, [1, 2, 3]], true],\n            ['inArray', [1, ['1', '2', '3']], false],\n            ['notInArray', [1, [1, 2, 3]], false],\n            ['notInArray', [1, ['1', '2', '3']], true],\n            ['contains', ['abcd', 'ab'], true],\n            ['contains', ['abcd', 'bc'], true],\n            ['contains', ['abcd', 'cd'], true],\n            ['contains', ['abcd', 'de'], false],\n            ['contains', ['', 'de'], false],\n            ['contains', ['äþçð', 'äþ'], true],\n            ['contains', ['äþçð', 'þç'], true],\n            ['contains', ['äþçð', 'çð'], true],\n            ['contains', ['äþçð', 'ðé'], false],\n            ['contains', ['', 'ðé'], false],\n            ['contains', ['あいうえ', 'あい'], true],\n            ['contains', ['あいうえ', 'いう'], true],\n            ['contains', ['あいうえ', 'うえ'], true],\n            ['contains', ['あいうえ', 'えお'], false],\n            ['contains', ['', 'えお'], false],\n            ['contains', ['😄😑☹️', '😄'], true],\n            ['contains', ['😄😑☹️', '😑'], true],\n            ['contains', ['😄😑☹️', '☹️'], true],\n            ['contains', ['😄😑☹️', '😄☹️'], false],\n            ['contains', ['', '😑'], false],\n            ['notContains', ['abcd', 'ab'], false],\n            ['notContains', ['abcd', 'bc'], false],\n            ['notContains', ['abcd', 'cd'], false],\n            ['notContains', ['abcd', 'de'], true],\n            ['notContains', ['', 'de'], true],\n            ['notContains', ['äþçð', 'äþ'], false],\n            ['notContains', ['äþçð', 'þç'], false],\n            ['notContains', ['äþçð', 'çð'], false],\n            ['notContains', ['äþçð', 'ðé'], true],\n            ['notContains', ['', 'ðé'], true],\n            ['notContains', ['あいうえ', 'あい'], false],\n            ['notContains', ['あいうえ', 'いう'], false],\n            ['notContains', ['あいうえ', 'うえ'], false],\n            ['notContains', ['あいうえ', 'えお'], true],\n            ['notContains', ['', 'えお'], true],\n            ['notContains', ['😄😑☹️', '😄'], false],\n            ['notContains', ['😄😑☹️', '😑'], false],\n            ['notContains', ['😄😑☹️', '☹️'], false],\n            ['notContains', ['😄😑☹️', '😄☹️'], true],\n            ['notContains', ['', '😑'], true],\n            ['notWhitespaceOnly', ['abc'], true],\n            ['notWhitespaceOnly', ['123'], true],\n            ['notWhitespaceOnly', [' abc '], true],\n            ['notWhitespaceOnly', ['a b c'], true],\n            ['notWhitespaceOnly', [''], false],\n            ['notWhitespaceOnly', [' '], false],\n            ['notWhitespaceOnly', [\"\\t\"], false],\n            ['notWhitespaceOnly', [\"\\n\"], false],\n            ['notWhitespaceOnly', [\"\\r\"], false],\n            ['notWhitespaceOnly', [\"\\r\\n\\t \"], false],\n            ['startsWith', ['abcd', 'ab'], true],\n            ['startsWith', ['abcd', 'bc'], false],\n            ['startsWith', ['', 'bc'], false],\n            ['startsWith', ['äþçð', 'äþ'], true],\n            ['startsWith', ['äþçð', 'þç'], false],\n            ['startsWith', ['', 'þç'], false],\n            ['startsWith', ['あいうえ', 'あい'], true],\n            ['startsWith', ['あいうえ', 'いう'], false],\n            ['startsWith', ['', 'いう'], false],\n            ['startsWith', ['😄😑☹️', '😄'], true],\n            ['startsWith', ['😄😑☹️', '😑'], false],\n            ['startsWith', ['', '😑'], false],\n            ['startsWithLetter', ['abcd'], true],\n            ['startsWithLetter', [[66]], false],\n            ['startsWithLetter', ['a'], true],\n            ['startsWithLetter', ['a1'], true],\n            ['startsWithLetter', ['1abcd'], false],\n            ['startsWithLetter', ['1'], false],\n            ['startsWithLetter', [''], false],\n            ['startsWithLetter', [null], false],\n            ['startsWithLetter', [66], false],\n            ['notStartsWith', ['abcd', 'ab'], false],\n            ['notStartsWith', ['abcd', 'bc'], true],\n            ['notStartsWith', ['', 'bc'], true],\n            ['notStartsWith', ['äþçð', 'äþ'], false],\n            ['notStartsWith', ['äþçð', 'þç'], true],\n            ['notStartsWith', ['', 'þç'], true],\n            ['notStartsWith', ['あいうえ', 'あい'], false],\n            ['notStartsWith', ['あいうえ', 'いう'], true],\n            ['notStartsWith', ['', 'いう'], true],\n            ['notStartsWith', ['😄😑☹️', '😄'], false],\n            ['notStartsWith', ['😄😑☹️', '😑'], true],\n            ['notStartsWith', ['', '😑'], true],\n            ['endsWith', ['abcd', 'cd'], true],\n            ['endsWith', ['abcd', 'bc'], false],\n            ['endsWith', ['', 'bc'], false],\n            ['endsWith', ['äþçð', 'çð'], true],\n            ['endsWith', ['äþçð', 'þç'], false],\n            ['endsWith', ['', 'þç'], false],\n            ['endsWith', ['あいうえ', 'うえ'], true],\n            ['endsWith', ['あいうえ', 'いう'], false],\n            ['endsWith', ['', 'いう'], false],\n            ['endsWith', ['😄😑☹️', '☹️'], true],\n            ['endsWith', ['😄😑☹️', '😑'], false],\n            ['endsWith', ['', '😑'], false],\n            ['notEndsWith', ['abcd', 'cd'], false],\n            ['notEndsWith', ['abcd', 'bc'], true],\n            ['notEndsWith', ['', 'bc'], true],\n            ['notEndsWith', ['äþçð', 'çð'], false],\n            ['notEndsWith', ['äþçð', 'þç'], true],\n            ['notEndsWith', ['', 'þç'], true],\n            ['notEndsWith', ['あいうえ', 'うえ'], false],\n            ['notEndsWith', ['あいうえ', 'いう'], true],\n            ['notEndsWith', ['', 'いう'], true],\n            ['notEndsWith', ['😄😑☹️', '☹️'], false],\n            ['notEndsWith', ['😄😑☹️', '😑'], true],\n            ['notEndsWith', ['', '😑'], true],\n            ['regex', ['abcd', '~^ab~'], true],\n            ['regex', ['abcd', '~^bc~'], false],\n            ['regex', ['', '~^bc~'], false],\n            ['notRegex', ['abcd', '{^ab}'], false],\n            ['notRegex', ['abcd', '{^bc}'], true],\n            ['notRegex', ['', '{^bc}'], true],\n            ['unicodeLetters', ['abcd'], true],\n            ['unicodeLetters', ['ᴁڅਘธブ乶'], true],\n            ['unicodeLetters', ['ȁȄ'], true],\n            ['unicodeLetters', ['ȁ1Ȅ'], false],\n            ['unicodeLetters', ['©'], false],\n            ['unicodeLetters', ['🙁'], false],\n            ['unicodeLetters', [''], false],\n            ['alpha', ['abcd'], true],\n            ['alpha', ['ab1cd'], false],\n            ['alpha', [''], false],\n            ['alpha', [66], false],\n            ['alpha', [[]], false],\n            ['digits', ['1234'], true],\n            ['digits', ['12a34'], false],\n            ['digits', [''], false],\n            ['digits', [1234], false],\n            ['alnum', ['ab12'], true],\n            ['alnum', ['ab12$'], false],\n            ['alnum', [''], false],\n            ['alnum', [1234], false],\n            ['lower', ['abcd'], true],\n            ['lower', ['abCd'], false],\n            ['lower', ['ab_d'], false],\n            ['lower', [''], false],\n            ['lower', [1234], false],\n            ['upper', ['ABCD'], true],\n            ['upper', ['ABcD'], false],\n            ['upper', ['AB_D'], false],\n            ['upper', [''], false],\n            ['upper', [1234], false],\n            ['length', ['abcd', 4], true],\n            ['length', ['abc', 4], false],\n            ['length', ['abcde', 4], false],\n            ['length', ['äbcd', 4], true, true],\n            ['length', ['äbc', 4], false, true],\n            ['length', ['äbcde', 4], false, true],\n            ['length', ['あbcd', 4], true, true], // 'HIRAGANA LETTER A' (U+3042)\n            ['length', ['あbc', 4], false, true],\n            ['length', ['あbcde', 4], false, true],\n            ['minLength', ['abcd', 4], true],\n            ['minLength', ['abcde', 4], true],\n            ['minLength', ['abc', 4], false],\n            ['minLength', ['äbcd', 4], true, true],\n            ['minLength', ['äbcde', 4], true, true],\n            ['minLength', ['äbc', 4], false, true],\n            ['minLength', ['あbcd', 4], true, true],\n            ['minLength', ['あbcde', 4], true, true],\n            ['minLength', ['あbc', 4], false, true],\n            ['maxLength', ['abcd', 4], true],\n            ['maxLength', ['abc', 4], true],\n            ['maxLength', ['abcde', 4], false],\n            ['maxLength', ['äbcd', 4], true, true],\n            ['maxLength', ['äbc', 4], true, true],\n            ['maxLength', ['äbcde', 4], false, true],\n            ['maxLength', ['あbcd', 4], true, true],\n            ['maxLength', ['あbc', 4], true, true],\n            ['maxLength', ['あbcde', 4], false, true],\n            ['lengthBetween', ['abcd', 3, 5], true],\n            ['lengthBetween', ['abc', 3, 5], true],\n            ['lengthBetween', ['abcde', 3, 5], true],\n            ['lengthBetween', ['ab', 3, 5], false],\n            ['lengthBetween', ['abcdef', 3, 5], false],\n            ['lengthBetween', ['äbcd', 3, 5], true, true],\n            ['lengthBetween', ['äbc', 3, 5], true, true],\n            ['lengthBetween', ['äbcde', 3, 5], true, true],\n            ['lengthBetween', ['äb', 3, 5], false, true],\n            ['lengthBetween', ['äbcdef', 3, 5], false, true],\n            ['lengthBetween', ['あbcd', 3, 5], true, true],\n            ['lengthBetween', ['あbc', 3, 5], true, true],\n            ['lengthBetween', ['あbcde', 3, 5], true, true],\n            ['lengthBetween', ['あb', 3, 5], false, true],\n            ['lengthBetween', ['あbcdef', 3, 5], false, true],\n            ['fileExists', [__FILE__], true],\n            ['fileExists', [__DIR__], true],\n            ['fileExists', [__DIR__.'/foobar'], false],\n            ['file', [__FILE__], true],\n            ['file', [__DIR__], false],\n            ['file', [__DIR__.'/foobar'], false],\n            ['directory', [__DIR__], true],\n            ['directory', [__FILE__], false],\n            ['directory', [__DIR__.'/foobar'], false],\n            // no tests for readable()/writable() for now\n            ['classExists', [__CLASS__], true],\n            ['classExists', [__NAMESPACE__.'\\Foobar'], false],\n            ['subclassOf', [__CLASS__, 'PHPUnit\\Framework\\TestCase'], true],\n            ['subclassOf', [__CLASS__, 'stdClass'], false],\n            ['interfaceExists', ['\\Countable'], true],\n            ['interfaceExists', [__CLASS__], false],\n            ['implementsInterface', ['ArrayIterator', 'Traversable'], true],\n            ['implementsInterface', [__CLASS__, 'Traversable'], false],\n            ['implementsInterface', [new DateTimeImmutable(), 'DateTimeInterface'], true],\n            ['implementsInterface', [new DateTimeImmutable(), 'Traversable'], false],\n            ['implementsInterface', [new ArrayIterator([]), 'DateTimeInterface'], false],\n            ['implementsInterface', [new ArrayIterator([]), 'Traversable'], true],\n            ['propertyExists', [(object) ['property' => 0], 'property'], true],\n            ['propertyExists', [(object) ['property' => null], 'property'], true],\n            ['propertyExists', [(object) ['property' => null], 'foo'], false],\n            ['propertyNotExists', [(object) ['property' => 0], 'property'], false],\n            ['propertyNotExists', [(object) ['property' => null], 'property'], false],\n            ['methodExists', ['RuntimeException', 'getMessage'], true],\n            ['methodExists', [new RuntimeException(), 'getMessage'], true],\n            ['methodExists', ['stdClass', 'getMessage'], false],\n            ['methodExists', [new stdClass(), 'getMessage'], false],\n            ['methodNotExists', ['RuntimeException', 'getMessage'], false],\n            ['methodNotExists', [new RuntimeException(), 'getMessage'], false],\n            ['methodNotExists', ['stdClass', 'getMessage'], true],\n            ['methodNotExists', [new stdClass(), 'getMessage'], true],\n            ['keyExists', [['key' => 0], 'key'], true],\n            ['keyExists', [['key' => null], 'key'], true],\n            ['keyExists', [['key' => null], 'foo'], false],\n            ['keyNotExists', [['key' => 0], 'key'], false],\n            ['keyNotExists', [['key' => null], 'key'], false],\n            ['keyNotExists', [['key' => null], 'foo'], true],\n            ['validArrayKey', ['abcd'], true],\n            ['validArrayKey', [1], true],\n            ['validArrayKey', [false], false],\n            ['validArrayKey', [true], false],\n            ['validArrayKey', [new stdClass()], false],\n            ['validArrayKey', [new ToStringClass('testString')], false],\n            ['validArrayKey', [self::getResource()], false],\n            ['count', [[0, 1, 2], 3], true],\n            ['count', [[0, 1, 2], 2], false],\n            ['minCount', [[0], 2], false],\n            ['minCount', [[0, 1], 2], true],\n            ['minCount', [[0, 1, 2], 2], true],\n            ['maxCount', [[0, 1, 2], 2], false],\n            ['maxCount', [[0, 1], 2], true],\n            ['maxCount', [[0], 2], true],\n            ['countBetween', [[0, 1, 2], 4, 5], false],\n            ['countBetween', [[0, 1, 2], 3, 5], true],\n            ['countBetween', [[0, 1, 2], 1, 2], false],\n            ['countBetween', [[0, 1, 2], 2, 5], true],\n            ['countBetween', [[0, 1, 2], 2, 3], true],\n            ['isList', [[1, 2, 3]], true],\n            ['isList', [[]], true],\n            ['isList', [[0 => 1, 2 => 3]], false],\n            ['isList', [['key' => 1, 'foo' => 2]], false],\n            ['isList', [true], false],\n            ['isList', [false], false],\n            ['isList', [[true]], true],\n            ['isList', [[false]], true],\n            ['isList', [[[1], [2]]], true],\n            ['isList', [[['foo' => 'bar'], ['baz' => 'tab']]], true],\n            ['isList', [$nanList], true],\n            ['isList', [$normalList], true],\n            ['isNonEmptyList', [[1, 2, 3]], true],\n            ['isNonEmptyList', [[]], false],\n            ['isNonEmptyList', [[0 => 1, 2 => 3]], false],\n            ['isNonEmptyList', [['key' => 1, 'foo' => 2]], false],\n            ['isNonEmptyList', [true], false],\n            ['isNonEmptyList', [false], false],\n            ['isNonEmptyList', [[true]], true],\n            ['isNonEmptyList', [[false]], true],\n            ['isNonEmptyList', [[[1], [2]]], true],\n            ['isNonEmptyList', [[['foo' => 'bar'], ['baz' => 'tab']]], true],\n            ['isMap', [['key' => 1, 'foo' => 2]], true],\n            ['isMap', [[0 => 1, 2 => 3]], true],\n            ['isMap', [[]], true],\n            ['isMap', [[1, 2, 3]], false],\n            ['isNonEmptyMap', [['key' => 1, 'foo' => 2]], true],\n            ['isNonEmptyMap', [[0 => 1, 2 => 3]], true],\n            ['isNonEmptyMap', [[]], false],\n            ['isNonEmptyMap', [[1, 2, 3]], false],\n            ['uuid', ['00000000-0000-0000-0000-000000000000'], true],\n            ['uuid', ['urn:ff6f8cb0-c57d-21e1-9b21-0800200c9a66'], true],\n            ['uuid', ['uuid:{ff6f8cb0-c57d-21e1-9b21-0800200c9a66}'], true],\n            ['uuid', ['ff6f8cb0-c57d-21e1-9b21-0800200c9a66'], true],\n            ['uuid', ['ff6f8cb0-c57d-11e1-9b21-0800200c9a66'], true],\n            ['uuid', ['ff6f8cb0-c57d-31e1-9b21-0800200c9a66'], true],\n            ['uuid', ['ff6f8cb0-c57d-41e1-9b21-0800200c9a66'], true],\n            ['uuid', ['ff6f8cb0-c57d-51e1-9b21-0800200c9a66'], true],\n            ['uuid', ['FF6F8CB0-C57D-11E1-9B21-0800200C9A66'], true],\n            ['uuid', [\"urn:ff6f8cb0-c57d-21e1-9b21-0800200c9a66\\n\"], false],\n            ['uuid', [\"ff6f8cb0-c57d-21e1-9b21-0800200c9a66\\n\"], false],\n            ['uuid', [\"FF6F8CB0-C57D-11E1-9B21-0800200C9A66\\n\"], false],\n            ['uuid', ['zf6f8cb0-c57d-11e1-9b21-0800200c9a66'], false],\n            ['uuid', ['af6f8cb0c57d11e19b210800200c9a66'], false],\n            ['uuid', ['ff6f8cb0-c57da-51e1-9b21-0800200c9a66'], false],\n            ['uuid', ['af6f8cb-c57d-11e1-9b21-0800200c9a66'], false],\n            ['uuid', ['3f6f8cb0-c57d-11e1-9b21-0800200c9a6'], false],\n            ['throws', [function () { throw new LogicException('test'); }, 'LogicException'], true],\n            ['throws', [function () { throw new LogicException('test'); }, 'IllogicException'], false],\n            ['throws', [function () { throw new Exception('test'); }], true],\n            ['throws', [function () { trigger_error('test'); }, 'Throwable'], false, false],\n            ['throws', [function () { trigger_error('test'); }, 'Unthrowable'], false, false],\n            ['throws', [function () { throw new Error(); }, 'Throwable'], true, true],\n            ['ip', ['192.168.0.1'], true],\n            ['ip', ['255.255.255.255'], true],\n            ['ip', ['0.0.0.0'], true],\n            ['ip', ['2001:0db8:0000:0042:0000:8a2e:0370:7334'], true],\n            ['ip', ['::ffff:192.0.2.1'], true],\n            ['ip', ['::1'], true],\n            ['ip', ['::'], true],\n            ['ip', ['foo'], false],\n            ['ip', [123], false],\n            ['ip', [[]], false],\n            ['ip', [null], false],\n            ['ip', [false], false],\n            ['ipv4', ['192.168.0.1'], true],\n            ['ipv4', ['255.255.255.255'], true],\n            ['ipv4', ['0.0.0.0'], true],\n            ['ipv4', ['2001:0db8:0000:0042:0000:8a2e:0370:7334'], false],\n            ['ipv4', ['::ffff:192.0.2.1'], false],\n            ['ipv4', ['::1'], false],\n            ['ipv4', ['::'], false],\n            ['ipv4', ['foo'], false],\n            ['ipv4', [123], false],\n            ['ipv4', [[]], false],\n            ['ipv4', [null], false],\n            ['ipv4', [false], false],\n            ['ipv6', ['192.168.0.1'], false],\n            ['ipv6', ['255.255.255.255'], false],\n            ['ipv6', ['0.0.0.0'], false],\n            ['ipv6', ['2001:0db8:0000:0042:0000:8a2e:0370:7334'], true],\n            ['ipv6', ['::ffff:192.0.2.1'], true],\n            ['ipv6', ['::1'], true],\n            ['ipv6', ['::'], true],\n            ['ipv6', ['foo'],  false],\n            ['ipv6', [123], false],\n            ['ipv6', [[]], false],\n            ['ipv6', [null], false],\n            ['ipv6', [false], false],\n            ['email', ['foo'], false],\n            ['email', [123], false],\n            ['email', ['foo.com'], false],\n            ['email', ['foo@bar.com'], true],\n            ['email', ['föö@bar.com'], true],\n            ['uniqueValues', [['qwerty', 'qwerty']], false],\n            ['uniqueValues', [['asdfg', 'qwerty']], true],\n            ['uniqueValues', [[123, '123']], false],\n            ['isStatic', [static function () {}], true],\n            ['isStatic', [function () {}], false],\n            ['notStatic', [static function () {}], false],\n            ['notStatic', [function () {}], true],\n        ];\n    }\n\n    public static function getMethods(): array\n    {\n        $methods = [];\n\n        foreach (self::getTests() as $params) {\n            $methods[$params[0]] = [$params[0]];\n        }\n\n        return array_values($methods);\n    }\n\n    #[DataProvider('getTests')]\n    public function testAssert(string $method, array $args, bool $success, bool $multibyte = false): void\n    {\n        if ($multibyte && !function_exists('mb_strlen')) {\n            $this->markTestSkipped('The function mb_strlen() is not available');\n        }\n\n        if (!$success) {\n            $this->expectException('\\InvalidArgumentException');\n        }\n\n        $result = call_user_func_array(['Webmozart\\Assert\\Assert', $method], $args);\n        $this->assertSame($args[array_key_first($args)], $result);\n    }\n\n    #[DataProvider('getTests')]\n    public function testNullOr(string $method, array $args, bool $success, bool $multibyte = false): void\n    {\n        if (in_array($method, self::SKIP_MIXIN_ASSERTION_TESTS)) {\n            $this->markTestSkipped(\"The method $method does not have nullOr Mixin.\");\n        }\n\n        if (in_array($method, ['null', 'notNull'])) {\n            $this->markTestSkipped('Meaningless test of '.$method);\n        }\n\n        if ($multibyte && !function_exists('mb_strlen')) {\n            $this->markTestSkipped('The function mb_strlen() is not available');\n        }\n\n        if (!$success && null !== reset($args)) {\n            $this->expectException('\\InvalidArgumentException');\n        }\n\n        $result = call_user_func_array(['Webmozart\\Assert\\Assert', 'nullOr'.ucfirst($method)], $args);\n        $this->assertSame($args[array_key_first($args)], $result);\n    }\n\n    #[DataProvider('getMethods')]\n    public function testNullOrAcceptsNull(string $method): void\n    {\n        if (in_array($method, self::SKIP_MIXIN_ASSERTION_TESTS)) {\n            $this->markTestSkipped(\"The method $method does not have nullOr Mixin.\");\n        }\n\n        if (in_array($method, ['null', 'notNull'])) {\n            $this->markTestSkipped('Meaningless test of '.$method);\n        }\n\n        $result = call_user_func(['Webmozart\\Assert\\Assert', 'nullOr'.ucfirst($method)], null, '', '');\n        $this->assertNull($result);\n    }\n\n    #[DataProvider('getTests')]\n    public function testAllArray(string $method, array $args, bool $success, bool $multibyte = false): void\n    {\n        if (in_array($method, self::SKIP_MIXIN_ASSERTION_TESTS)) {\n            $this->markTestSkipped(\"The method $method does not have all Mixin.\");\n        }\n\n        if ($multibyte && !function_exists('mb_strlen')) {\n            $this->markTestSkipped('The function mb_strlen() is not available');\n        }\n\n        if (!$success) {\n            $this->expectException('\\InvalidArgumentException');\n        }\n\n        $arg = array_shift($args);\n        array_unshift($args, [$arg]);\n\n        $result = call_user_func_array(['Webmozart\\Assert\\Assert', 'all'.ucfirst($method)], $args);\n        $this->assertSame($args[array_key_first($args)], $result);\n    }\n\n    #[DataProvider('getTests')]\n    public function testAllNullOrArray(string $method, array $args, bool $success, bool $multibyte = false): void\n    {\n        if (in_array($method, self::SKIP_MIXIN_ASSERTION_TESTS)) {\n            $this->markTestSkipped(\"The method $method does not have allNullOr Mixin.\");\n        }\n\n        if (in_array($method, ['null', 'notNull'])) {\n            $this->markTestSkipped('Meaningless test of '.$method);\n        }\n\n        if ($multibyte && !function_exists('mb_strlen')) {\n            $this->markTestSkipped('The function mb_strlen() is not available');\n        }\n\n        $arg = array_shift($args);\n\n        if ($arg === null) {\n            $this->addToAssertionCount(1);\n\n            return;\n        }\n\n        if (!$success) {\n            $this->expectException('\\InvalidArgumentException');\n        }\n\n        array_unshift($args, [$arg, null]);\n\n        $result = call_user_func_array(['Webmozart\\Assert\\Assert', 'allNullOr'.ucfirst($method)], $args);\n        $this->assertSame($args[array_key_first($args)], $result);\n    }\n\n    #[DataProvider('getTests')]\n    public function testAllTraversable(string $method, array $args, bool $success, bool $multibyte = false): void\n    {\n        if (in_array($method, self::SKIP_MIXIN_ASSERTION_TESTS)) {\n            $this->markTestSkipped(\"The method $method does not have all Mixin.\");\n        }\n\n        if ($multibyte && !function_exists('mb_strlen')) {\n            $this->markTestSkipped('The function mb_strlen() is not available');\n        }\n\n        if (!$success) {\n            $this->expectException('\\InvalidArgumentException');\n        }\n\n        $arg = array_shift($args);\n        array_unshift($args, new ArrayIterator([$arg]));\n\n        $result = call_user_func_array(['Webmozart\\Assert\\Assert', 'all'.ucfirst($method)], $args);\n        $this->assertSame($args[array_key_first($args)], $result);\n    }\n\n    public static function getStringConversions(): array\n    {\n        return [\n            ['integer', ['foobar'], 'Expected an integer. Got: string'],\n            ['string', [1], 'Expected a string. Got: integer'],\n            ['string', [true], 'Expected a string. Got: boolean'],\n            ['string', [null], 'Expected a string. Got: NULL'],\n            ['string', [[]], 'Expected a string. Got: array'],\n            ['string', [new stdClass()], 'Expected a string. Got: stdClass'],\n            ['string', [self::getResource()], 'Expected a string. Got: resource'],\n\n            ['eq', ['1', '2'], 'Expected a value equal to \"2\". Got: \"1\"'],\n            ['eq', [new ToStringClass('XXX'), new ToStringClass('YYY')], 'Expected a value equal to Webmozart\\Assert\\Tests\\ToStringClass: \"YYY\". Got: Webmozart\\Assert\\Tests\\ToStringClass: \"XXX\"'],\n            ['eq', [1, 2], 'Expected a value equal to 2. Got: 1'],\n            ['eq', [true, false], 'Expected a value equal to false. Got: true'],\n            ['eq', [true, null], 'Expected a value equal to null. Got: true'],\n            ['eq', [null, true], 'Expected a value equal to true. Got: null'],\n            ['eq', [[1], [2]], 'Expected a value equal to array. Got: array'],\n            ['eq', [new ArrayIterator([]), new stdClass()], 'Expected a value equal to stdClass. Got: ArrayIterator'],\n            ['eq', [1, self::getResource()], 'Expected a value equal to resource. Got: 1'],\n\n            ['lessThan', [new DateTime('2020-01-01 00:00:00+00:00'), new DateTime('1999-01-01 00:00:00+00:00')], 'Expected a value less than DateTime: \"1999-01-01T00:00:00+00:00\". Got: DateTime: \"2020-01-01T00:00:00+00:00\"'],\n        ];\n    }\n\n    #[DataProvider('getStringConversions')]\n    public function testConvertValuesToStrings(string $method, array $args, string $exceptionMessage): void\n    {\n        $this->expectException('\\InvalidArgumentException');\n        $this->expectExceptionMessage($exceptionMessage);\n\n        call_user_func_array(['Webmozart\\Assert\\Assert', $method], $args);\n    }\n\n    public static function getInvalidInstanceOfCases(): iterable\n    {\n        yield [\n            [null, 'stdClass'],\n            'Expected an instance of stdClass. Got: NULL',\n        ];\n\n        yield [\n            [123, 'stdClass'],\n            'Expected an instance of stdClass. Got: integer',\n        ];\n\n        yield [\n            [[], 'Iterator'],\n            'Expected an instance of Iterator. Got: array',\n        ];\n\n        yield [\n            [new stdClass(), 'Iterator'],\n            'Expected an instance of Iterator. Got: stdClass',\n        ];\n    }\n\n    #[DataProvider('getInvalidInstanceOfCases')]\n    public function testInstanceOfExceptionMessages(array $args, string $exceptionMessage): void\n    {\n        $this->expectException('\\InvalidArgumentException');\n        $this->expectExceptionMessage($exceptionMessage);\n\n        call_user_func_array(['Webmozart\\Assert\\Assert', 'isInstanceOf'], $args);\n    }\n\n    public static function getInvalidIsAOfCases(): iterable\n    {\n        yield [\n            ['stdClass', 123],\n            'Expected class as a string. Got: integer',\n        ];\n\n        yield [\n            ['Iterator', 'ArrayIterator'],\n            'Expected an instance of this class or to this class among its parents \"ArrayIterator\". Got: \"Iterator\"',\n        ];\n\n        yield [\n            [123, 'Iterator'],\n            'Expected an instance of this class or to this class among its parents \"Iterator\". Got: 123',\n        ];\n\n        yield [\n            [[], 'Iterator'],\n            'Expected an instance of this class or to this class among its parents \"Iterator\". Got: array',\n        ];\n\n        yield [\n            [new stdClass(), 'Iterator'],\n            'Expected an instance of this class or to this class among its parents \"Iterator\". Got: stdClass',\n        ];\n    }\n\n    #[DataProvider('getInvalidIsAOfCases')]\n    public function testIsAOfExceptionMessages(array $args, string $exceptionMessage): void\n    {\n        $this->expectException('\\InvalidArgumentException');\n        $this->expectExceptionMessage($exceptionMessage);\n\n        call_user_func_array(['Webmozart\\Assert\\Assert', 'isAOf'], $args);\n    }\n\n    public function testResourceOfTypeCustomMessage(): void\n    {\n        $this->expectException('\\InvalidArgumentException');\n        $this->expectExceptionMessage('I want a resource of type curl. Got: NULL');\n\n        Assert::resource(null, 'curl', 'I want a resource of type %2$s. Got: %s');\n    }\n\n    public function testEnumAssertionErrorMessage(): void\n    {\n        $this->expectException('\\InvalidArgumentException');\n        $this->expectExceptionMessage('Expected null. Got: Webmozart\\Assert\\Tests\\DummyEnum::CaseName');\n\n        Assert::null(DummyEnum::CaseName, 'Expected null. Got: %s');\n    }\n\n    #[DataProvider('getMethodsThatUseOtherMethods')]\n    public function testMessageIsPassedToInternalCalls(string $method, array $args, string $exceptionMessage): void\n    {\n        $this->expectException('\\InvalidArgumentException');\n        $this->expectExceptionMessage($exceptionMessage);\n\n        call_user_func_array(['Webmozart\\Assert\\Assert', $method], $args);\n    }\n\n    public static function getMethodsThatUseOtherMethods(): array\n    {\n        return [\n            [\n                'method' => 'positiveInteger',\n                'args' => ['not-integer', 'Value must be a positive integer. Got: %s'],\n                'exceptionMessage' => 'Value must be a positive integer. Got: string',\n            ],\n            [\n                'method' => 'notNegativeInteger',\n                'args' => ['not-integer', 'Value must be a non-negative integer. Got: %s'],\n                'exceptionMessage' => 'Value must be a non-negative integer. Got: string',\n            ],\n            [\n                'method' => 'negativeInteger',\n                'args' => ['not-integer', 'Value must be a negative integer. Got: %s'],\n                'exceptionMessage' => 'Value must be a negative integer. Got: string',\n            ],\n            [\n                'method' => 'ip',\n                'args' => [127001, 'Value must be a valid IP. Got: %s'],\n                'exceptionMessage' => 'Value must be a valid IP. Got: integer',\n            ],\n            [\n                'method' => 'ipv4',\n                'args' => [127001, 'Value must be a valid IPv4. Got: %s'],\n                'exceptionMessage' => 'Value must be a valid IPv4. Got: integer',\n            ],\n            [\n                'method' => 'ipv6',\n                'args' => [127001, 'Value must be a valid IPv6. Got: %s'],\n                'exceptionMessage' => 'Value must be a valid IPv6. Got: integer',\n            ],\n            [\n                'method' => 'email',\n                'args' => [111111, 'Value must be a valid email. Got: %s'],\n                'exceptionMessage' => 'Value must be a valid email. Got: integer',\n            ],\n            [\n                'method' => 'unicodeLetters',\n                'args' => [111, 'Value must be a string with valid unicode characters. Got: %s'],\n                'exceptionMessage' => 'Value must be a string with valid unicode characters. Got: integer',\n            ],\n            [\n                'method' => 'alpha',\n                'args' => [111, 'Value must be a string with only alphabetic characters. Got: %s'],\n                'exceptionMessage' => 'Value must be a string with only alphabetic characters. Got: integer',\n            ],\n            [\n                'method' => 'digits',\n                'args' => [111, 'Value must be a string with only digits. Got: %s'],\n                'exceptionMessage' => 'Value must be a string with only digits. Got: integer',\n            ],\n            [\n                'method' => 'alnum',\n                'args' => [111, 'Value must be a string with only alphanumeric characters. Got: %s'],\n                'exceptionMessage' => 'Value must be a string with only alphanumeric characters. Got: integer',\n            ],\n            [\n                'method' => 'lower',\n                'args' => [111, 'Value must be a string with only lowercase characters. Got: %s'],\n                'exceptionMessage' => 'Value must be a string with only lowercase characters. Got: integer',\n            ],\n            [\n                'method' => 'upper',\n                'args' => [111, 'Value must be a string with only uppercase characters. Got: %s'],\n                'exceptionMessage' => 'Value must be a string with only uppercase characters. Got: integer',\n            ],\n            [\n                'method' => 'keyExists',\n                'args' => [111, 'test', 'Value must be an array with key test. Got: %s'],\n                'exceptionMessage' => 'Value must be an array with key test. Got: integer',\n            ],\n            [\n                'method' => 'keyNotExists',\n                'args' => [111, 'test', 'Value must be an array without key test. Got: %s'],\n                'exceptionMessage' => 'Value must be an array without key test. Got: integer',\n            ],\n            [\n                'method' => 'isInstanceOf',\n                'args' => [111, 'stdClass', 'Value must be an instance of stdClass. Got: %s'],\n                'exceptionMessage' => 'Value must be an instance of stdClass. Got: integer',\n            ],\n            [\n                'method' => 'notInstanceOf',\n                'args' => [111, 'stdClass', 'Value must be an instance of stdClass. Got: %s'],\n                'exceptionMessage' => 'Value must be an instance of stdClass. Got: integer',\n            ],\n            [\n                'method' => 'isInstanceOfAny',\n                'args' => [111, ['stdClass'], 'Value must be an instance of stdClass. Got: %s'],\n                'exceptionMessage' => 'Value must be an instance of stdClass. Got: integer',\n            ],\n            [\n                'method' => 'isNotA',\n                'args' => [111, 'stdClass', 'Value must be an instance of stdClass. Got: %s'],\n                'exceptionMessage' => 'Value must be an instance of stdClass. Got: integer',\n            ],\n            [\n                'method' => 'isAnyOf',\n                'args' => [111, ['stdClass'], 'Value must be an instance of stdClass. Got: %s'],\n                'exceptionMessage' => 'Value must be an instance of stdClass. Got: integer',\n            ],\n        ];\n    }\n}\n\n/**\n * @ignore\n */\nclass ToStringClass\n{\n    /**\n     * @var string\n     */\n    private $value;\n\n    public function __construct(string $value)\n    {\n        $this->value = $value;\n    }\n\n    public function __toString(): string\n    {\n        return $this->value;\n    }\n}\n"
  },
  {
    "path": "tests/DummyEnum.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests;\n\n// The filename must be different from the class name to be ignored by composer PSR-4 autoloading rules\nenum DummyEnum\n{\n    case CaseName;\n}\n"
  },
  {
    "path": "tests/ProjectCodeTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests;\n\nuse PHPUnit\\Framework\\Attributes\\BeforeClass;\nuse PHPUnit\\Framework\\Attributes\\CoversNothing;\nuse PHPUnit\\Framework\\Attributes\\DataProvider;\nuse PHPUnit\\Framework\\TestCase;\nuse ReflectionClass;\nuse ReflectionMethod;\nuse Webmozart\\Assert\\Bin\\MixinGenerator;\n\n#[CoversNothing]\nclass ProjectCodeTest extends TestCase\n{\n    private static string $readmeContent;\n    private static string $assertDocComment;\n    private static array $mixinMethodNames;\n\n    /** @var string[] */\n    private array $methodDoesNotHaveNullOrMixin = [\n        'isInitialized',\n    ];\n\n    /** @var string[] */\n    private array $methodDoesNotHaveAllMixin = [\n        'isInitialized',\n    ];\n\n    #[BeforeClass]\n    public static function scanStaticContent(): void\n    {\n        self::$readmeContent = file_get_contents(__DIR__.'/../README.md');\n\n        $rc = new ReflectionClass('\\Webmozart\\Assert\\Mixin');\n        self::$assertDocComment = $rc->getDocComment();\n\n        self::$mixinMethodNames = [];\n        foreach ($rc->getMethods() as $method) {\n            self::$mixinMethodNames[] = $method->name;\n        }\n    }\n\n    #[DataProvider('providesMethodNames')]\n    public function testHasNullOr(string $method): void\n    {\n        if (in_array($method, $this->methodDoesNotHaveNullOrMixin)) {\n            $this->markTestSkipped(\"The method $method does not have nullOr Mixin.\");\n        }\n\n        $fullMethodName = 'nullOr'.ucfirst($method);\n\n        if ($method === 'notNull' || $method === 'null') {\n            $this->addToAssertionCount(1);\n\n            return;\n        }\n        $correct = strpos((string) self::$assertDocComment, '@method static void '.$fullMethodName);\n        if (!$correct) {\n            $correct = in_array($fullMethodName, self::$mixinMethodNames, true);\n        }\n\n        if ($correct === false) {\n            $this->fail(sprintf(\n                'All methods have a corresponding \"nullOr\" method, please add the \"%s\" method to the class level doc comment.',\n                $fullMethodName\n            ));\n        }\n\n        $this->addToAssertionCount(1);\n    }\n\n    #[DataProvider('providesMethodNames')]\n    public function testHasAll(string $method): void\n    {\n        if (in_array($method, $this->methodDoesNotHaveAllMixin)) {\n            $this->markTestSkipped(\"The method $method does not have all Mixin.\");\n        }\n\n        $fullMethodName = 'all'.ucfirst($method);\n\n        $correct = strpos((string) self::$assertDocComment, '@method static void '.$fullMethodName);\n        if (!$correct) {\n            $correct = in_array($fullMethodName, self::$mixinMethodNames, true);\n        }\n\n        if ($correct === false) {\n            $this->fail(sprintf(\n                'All methods have a corresponding \"all\" method, please add the \"%s\" method to the class level doc comment.',\n                $fullMethodName\n            ));\n        }\n\n        $this->addToAssertionCount(1);\n    }\n\n    #[DataProvider('providesMethodNames')]\n    public function testIsInReadme(string $method): void\n    {\n        $correct = strpos((string) self::$readmeContent, $method);\n\n        if ($correct === false) {\n            $this->fail(sprintf(\n                'All methods must be documented in the README.md, please add the \"%s\" method.',\n                $method\n            ));\n        }\n        $this->addToAssertionCount(1);\n    }\n\n    #[DataProvider('provideMethods')]\n    public function testHasThrowsAnnotation(ReflectionMethod $method): void\n    {\n        $doc = $method->getDocComment();\n\n        $this->assertNotFalse(\n            $doc,\n            sprintf(\n                'Expected a doc comment on the \"%s\" method, but none found',\n                $method->getName()\n            )\n        );\n\n        $this->assertStringContainsString(\n            '@throws InvalidArgumentException',\n            $doc,\n            sprintf(\n                'Expected method \"%s\" to have an @throws InvalidArgumentException annotation, but none found',\n                $method->getName()\n            )\n        );\n    }\n\n    #[DataProvider('provideMethods')]\n    public function testHasCorrespondingStaticAnalysisFile(ReflectionMethod $method): void\n    {\n        $doc = $method->getDocComment();\n\n        if ($doc === false || strpos($doc, '@psalm-assert') === false) {\n            $this->addToAssertionCount(1);\n\n            return;\n        }\n\n        $this->assertFileExists(\n            __DIR__.'/static-analysis/assert-'.$method->getName().'.php'\n        );\n    }\n\n    public function testMixinIsUpToDateVersion(): void\n    {\n        if (PHP_OS_FAMILY === 'Windows') {\n            $this->markTestSkipped('mixin generator is not expected to run on Windows');\n\n            return;\n        }\n\n        require_once __DIR__.'/../bin/src/MixinGenerator.php';\n\n        $generator = new MixinGenerator();\n\n        $actual = file_get_contents(__DIR__.'/../src/Mixin.php');\n\n        $this->assertEquals($generator->generate(), $actual, 'please regenerate Mixin with `php bin/generate.php` command in the project root');\n    }\n\n    /**\n     * @return array\n     */\n    public static function providesMethodNames(): array\n    {\n        return array_map(function (ReflectionMethod $value) {\n            return [$value->getName()];\n        }, self::getMethods());\n    }\n\n    /**\n     * @return array\n     */\n    public static function provideMethods(): array\n    {\n        return array_map(function (ReflectionMethod $value) {\n            return [$value];\n        }, self::getMethods());\n    }\n\n    /**\n     * @return array\n     */\n    private static function getMethods(): array\n    {\n        static $methods;\n\n        if ($methods !== null) {\n            return $methods;\n        }\n\n        $rc = new ReflectionClass('\\Webmozart\\Assert\\Assert');\n        $methods = [];\n\n        $rcMethods = $rc->getMethods(ReflectionMethod::IS_PUBLIC);\n\n        foreach ($rcMethods as $rcMethod) {\n            if ($rcMethod->getFileName() !== $rc->getFileName()) {\n                continue;\n            }\n\n            $methodName = $rcMethod->getName();\n            if (strpos($methodName, '__') === 0) {\n                continue;\n            }\n            $methods[] = $rcMethod;\n        }\n\n        return $methods;\n    }\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-alnum.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n */\nfunction alnum(string $value): string\n{\n    Assert::alnum($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n */\nfunction nullOrAlnum(?string $value): ?string\n{\n    Assert::nullOrAlnum($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string> $value\n */\nfunction allAlnum(iterable $value): iterable\n{\n    Assert::allAlnum($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string|null> $value\n */\nfunction allNullOrAlnum(iterable $value): iterable\n{\n    Assert::allNullOrAlnum($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-alpha.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction alpha(mixed $value): mixed\n{\n    Assert::alpha($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction nullOrAlpha(mixed $value): mixed\n{\n    Assert::nullOrAlpha($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allAlpha(mixed $value): mixed\n{\n    Assert::allAlpha($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrAlpha(mixed $value): mixed\n{\n    Assert::allNullOrAlpha($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-boolean.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction boolean(mixed $value): bool\n{\n    Assert::boolean($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction nullOrBoolean(mixed $value): ?bool\n{\n    Assert::nullOrBoolean($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allBoolean(mixed $value): iterable\n{\n    Assert::allBoolean($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrBoolean(mixed $value): iterable\n{\n    Assert::allNullOrBoolean($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-classExists.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @param mixed $value\n *\n * @return class-string\n */\nfunction classExists(mixed $value): string\n{\n    Assert::classExists($value);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n *\n * @return class-string|null\n */\nfunction nullOrClassExists(mixed $value): ?string\n{\n    Assert::nullOrClassExists($value);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n */\nfunction allClassExists(mixed $value): iterable\n{\n    Assert::allClassExists($value);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n */\nfunction allNullOrClassExists(mixed $value): iterable\n{\n    Assert::allNullOrClassExists($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-contains.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n */\nfunction contains(string $value, string $subString): string\n{\n    Assert::contains($value, $subString);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n */\nfunction nullOrContains(?string $value, string $subString): ?string\n{\n    Assert::nullOrContains($value, $subString);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string> $value\n */\nfunction allContains(iterable $value, string $subString): iterable\n{\n    Assert::allContains($value, $subString);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string|null> $value\n */\nfunction allNullOrContains(iterable $value, string $subString): iterable\n{\n    Assert::allNullOrContains($value, $subString);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-count.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Countable;\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @param Countable|array $value\n */\nfunction count(Countable|array $value, int $number): Countable|array\n{\n    Assert::count($value, $number);\n\n    return $value;\n}\n\n/**\n * @param null|Countable|array $value\n */\nfunction nullOrCount(Countable|array|null $value, int $number): Countable|array|null\n{\n    Assert::nullOrCount($value, $number);\n\n    return $value;\n}\n\n/**\n * @param iterable<Countable|array> $value\n */\nfunction allCount(iterable $value, int $number): iterable\n{\n    Assert::allCount($value, $number);\n\n    return $value;\n}\n\n/**\n * @param iterable<Countable|array|null> $value\n */\nfunction allNullOrCount(iterable $value, int $number): iterable\n{\n    Assert::allCount($value, $number);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-countBetween.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Countable;\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @param Countable|array $value\n * @param int|float $min\n * @param int|float $max\n */\nfunction countBetween($value, $min, $max): Countable|array\n{\n    Assert::countBetween($value, $min, $max);\n\n    return $value;\n}\n\n/**\n * @param null|Countable|array $value\n * @param int|float $min\n * @param int|float $max\n */\nfunction nullOrCountBetween($value, $min, $max): Countable|array|null\n{\n    Assert::nullOrCountBetween($value, $min, $max);\n\n    return $value;\n}\n\n/**\n * @param iterable<Countable|array> $value\n * @param int|float $min\n * @param int|float $max\n */\nfunction allCountBetween(iterable $value, $min, $max): iterable\n{\n    Assert::allCountBetween($value, $min, $max);\n\n    return $value;\n}\n\n/**\n * @param iterable<Countable|array|null> $value\n * @param int|float $min\n * @param int|float $max\n */\nfunction allNullOrCountBetween(iterable $value, $min, $max): iterable\n{\n    Assert::allNullOrCountBetween($value, $min, $max);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-digits.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n */\nfunction digits(string $value): string\n{\n    Assert::digits($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n */\nfunction nullOrDigits(?string $value): ?string\n{\n    Assert::nullOrDigits($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string> $value\n */\nfunction allDigits(iterable $value): iterable\n{\n    Assert::allDigits($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string|null> $value\n */\nfunction allNullOrDigits(iterable $value): iterable\n{\n    Assert::allNullOrDigits($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-directory.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @param mixed $value\n */\nfunction directory(mixed $value): mixed\n{\n    Assert::directory($value);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n */\nfunction nullOrDirectory(mixed $value): mixed\n{\n    Assert::nullOrDirectory($value);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n */\nfunction allDirectory(mixed $value): mixed\n{\n    Assert::allDirectory($value);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n */\nfunction allNullOrDirectory(mixed $value): mixed\n{\n    Assert::allNullOrDirectory($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-email.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @param mixed $value\n */\nfunction email(mixed $value): mixed\n{\n    Assert::email($value);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n */\nfunction nullOrEmail(mixed $value): mixed\n{\n    Assert::nullOrEmail($value);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n */\nfunction allEmail(mixed $value): mixed\n{\n    Assert::allEmail($value);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n */\nfunction allNullOrEmail(mixed $value): mixed\n{\n    Assert::allNullOrEmail($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-endsWith.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n */\nfunction endsWith(string $value, string $suffix): string\n{\n    Assert::endsWith($value, $suffix);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n */\nfunction nullOrEndsWith(?string $value, string $suffix): ?string\n{\n    Assert::nullOrEndsWith($value, $suffix);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string> $value\n */\nfunction allEndsWith(iterable $value, string $suffix): iterable\n{\n    Assert::allEndsWith($value, $suffix);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string|null> $value\n */\nfunction allNullOrEndsWith(iterable $value, string $suffix): iterable\n{\n    Assert::allNullOrEndsWith($value, $suffix);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-eq.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @param mixed $value\n * @param mixed $expect\n */\nfunction eq($value, $expect): mixed\n{\n    Assert::eq($value, $expect);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n * @param mixed $expect\n */\nfunction nullOrEq($value, $expect): mixed\n{\n    Assert::nullOrEq($value, $expect);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n * @param mixed $expect\n */\nfunction allEq($value, $expect): mixed\n{\n    Assert::allEq($value, $expect);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n * @param mixed $expect\n */\nfunction allNullOrEq($value, $expect): mixed\n{\n    Assert::allNullOrEq($value, $expect);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-false.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return false\n */\nfunction false(mixed $value): bool\n{\n    Assert::false($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return null|false\n */\nfunction nullOrFalse(mixed $value): ?bool\n{\n    Assert::nullOrFalse($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allFalse(mixed $value): iterable\n{\n    Assert::allFalse($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrFalse(mixed $value): iterable\n{\n    Assert::allFalse($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-file.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @param mixed $value\n */\nfunction file(mixed $value): mixed\n{\n    Assert::file($value);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n */\nfunction nullOrFile(mixed $value): mixed\n{\n    Assert::nullOrFile($value);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n */\nfunction allFile(mixed $value): mixed\n{\n    Assert::allFile($value);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n */\nfunction allNullOrFile(mixed $value): mixed\n{\n    Assert::allNullOrFile($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-fileExists.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @param mixed $value\n */\nfunction fileExists(mixed $value): mixed\n{\n    Assert::fileExists($value);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n */\nfunction nullOrFileExists(mixed $value): mixed\n{\n    Assert::nullOrFileExists($value);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n */\nfunction allFileExists(mixed $value): mixed\n{\n    Assert::allFileExists($value);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n */\nfunction allNullOrFileExists(mixed $value): mixed\n{\n    Assert::allNullOrFileExists($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-float.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction float(mixed $value): float\n{\n    Assert::float($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction nullOrFloat(mixed $value): ?float\n{\n    Assert::nullOrFloat($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allFloat(mixed $value): iterable\n{\n    Assert::allFloat($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrFloat(mixed $value): iterable\n{\n    Assert::allNullOrFloat($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-greaterThan.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param mixed $limit\n */\nfunction greaterThan($value, $limit): mixed\n{\n    Assert::greaterThan($value, $limit);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param mixed $limit\n */\nfunction nullOrGreaterThan($value, $limit): mixed\n{\n    Assert::nullOrGreaterThan($value, $limit);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param mixed $limit\n */\nfunction allGreaterThan($value, $limit): mixed\n{\n    Assert::allGreaterThan($value, $limit);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param mixed $limit\n */\nfunction allNullOrGreaterThan($value, $limit): mixed\n{\n    Assert::allNullOrGreaterThan($value, $limit);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-greaterThanEq.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param mixed $limit\n */\nfunction greaterThanEq($value, $limit): mixed\n{\n    Assert::greaterThanEq($value, $limit);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param mixed $limit\n */\nfunction nullOrGreaterThanEq($value, $limit): mixed\n{\n    Assert::nullOrGreaterThanEq($value, $limit);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param mixed $limit\n */\nfunction allGreaterThanEq($value, $limit): mixed\n{\n    Assert::allGreaterThanEq($value, $limit);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param mixed $limit\n */\nfunction allNullOrGreaterThanEq($value, $limit): mixed\n{\n    Assert::allNullOrGreaterThanEq($value, $limit);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-implementsInterface.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Serializable;\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return Serializable|class-string<Serializable>\n */\nfunction implementsInterface(mixed $value)\n{\n    Assert::implementsInterface($value, Serializable::class);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return Serializable|class-string<Serializable>|null\n */\nfunction nullOrImplementsInterface(mixed $value)\n{\n    Assert::nullOrImplementsInterface($value, Serializable::class);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allImplementsInterface(mixed $value): iterable\n{\n    Assert::allImplementsInterface($value, Serializable::class);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrImplementsInterface(mixed $value): iterable\n{\n    Assert::allNullOrImplementsInterface($value, Serializable::class);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-inArray.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction inArray($value, array $values): mixed\n{\n    Assert::inArray($value, $values);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction nullOrInArray($value, array $values): mixed\n{\n    Assert::nullOrInArray($value, $values);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allInArray($value, array $values): mixed\n{\n    Assert::allInArray($value, $values);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrInArray($value, array $values): mixed\n{\n    Assert::allNullOrInArray($value, $values);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-integer.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction integer(mixed $value): int\n{\n    Assert::integer($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction nullOrInteger(mixed $value): ?int\n{\n    Assert::nullOrInteger($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allInteger(mixed $value): iterable\n{\n    Assert::allInteger($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrInteger(mixed $value): iterable\n{\n    Assert::allNullOrInteger($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-integerish.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return numeric\n */\nfunction integerish(mixed $value)\n{\n    Assert::integerish($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return null|numeric\n */\nfunction nullOrIntegerish(mixed $value)\n{\n    Assert::nullOrIntegerish($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allIntegerish(mixed $value): iterable\n{\n    Assert::allIntegerish($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrIntegerish(mixed $value): iterable\n{\n    Assert::allNullOrIntegerish($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-interfaceExists.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @param mixed $value\n *\n * @return class-string\n */\nfunction interfaceExists(mixed $value): string\n{\n    Assert::interfaceExists($value);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n *\n * @return null|class-string\n */\nfunction nullOrInterfaceExists(mixed $value): ?string\n{\n    Assert::nullOrInterfaceExists($value);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n */\nfunction allInterfaceExists(mixed $value): iterable\n{\n    Assert::allInterfaceExists($value);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n */\nfunction allNullOrInterfaceExists(mixed $value): iterable\n{\n    Assert::allNullOrInterfaceExists($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-ip.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @param mixed $value\n */\nfunction ip(mixed $value): mixed\n{\n    Assert::ip($value);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n */\nfunction nullOrIp(mixed $value): mixed\n{\n    Assert::nullOrIp($value);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n */\nfunction allIp(mixed $value): mixed\n{\n    Assert::allIp($value);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n */\nfunction allNullOrIp(mixed $value): mixed\n{\n    Assert::allNullOrIp($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-ipv4.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @param mixed $value\n */\nfunction ipv4($value): mixed\n{\n    Assert::ipv4($value);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n */\nfunction nullOrIpv4($value): mixed\n{\n    Assert::nullOrIpv4($value);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n */\nfunction allIpv4($value): mixed\n{\n    Assert::allIpv4($value);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n */\nfunction allNullOrIpv4($value): mixed\n{\n    Assert::allNullOrIpv4($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-ipv6.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @param mixed $value\n */\nfunction ipv6($value): mixed\n{\n    Assert::ipv6($value);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n */\nfunction nullOrIpv6($value): mixed\n{\n    Assert::nullOrIpv6($value);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n */\nfunction allIpv6($value): mixed\n{\n    Assert::allIpv6($value);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n */\nfunction allNullOrIpv6($value): mixed\n{\n    Assert::allNullOrIpv6($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-isAOf.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Serializable;\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param object|string $value\n *\n * @psalm-return class-string<Serializable>|Serializable\n */\nfunction isAOf(mixed $value): mixed\n{\n    Assert::isAOf($value, Serializable::class);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param null|object|string $value\n *\n * @psalm-return null|class-string<Serializable>|Serializable\n */\nfunction nullOrIsAOf(mixed $value): mixed\n{\n    Assert::nullOrIsAOf($value, Serializable::class);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<object|string> $value\n *\n * @return iterable<class-string<Serializable>|Serializable>\n */\nfunction allIsAOf(mixed $value): iterable\n{\n    Assert::allIsAOf($value, Serializable::class);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<object|string|null> $value\n *\n * @return iterable<class-string<Serializable>|Serializable|null>\n */\nfunction allNullOrIsAOf(mixed $value): iterable\n{\n    Assert::allNullOrIsAOf($value, Serializable::class);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-isAnyOf.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param object|string $value\n * @param array<class-string> $classes\n */\nfunction isAnyOf($value, array $classes): object|string\n{\n    Assert::isAnyOf($value, $classes);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param null|object|string $value\n * @param array<class-string> $classes\n */\nfunction nullOrIsAnyOf($value, array $classes): object|string|null\n{\n    Assert::nullOrIsAnyOf($value, $classes);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<object|string> $value\n * @param array<class-string> $classes\n */\nfunction allIsAnyOf($value, array $classes): iterable\n{\n    Assert::allIsAnyOf($value, $classes);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<object|string|null> $value\n * @param array<class-string> $classes\n */\nfunction allNullOrIsAnyOf($value, array $classes): iterable\n{\n    Assert::allNullOrIsAnyOf($value, $classes);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-isArray.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction isArray(mixed $value): array\n{\n    Assert::isArray($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction nullOrIsArray(mixed $value): ?array\n{\n    Assert::nullOrIsArray($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allIsArray(mixed $value): iterable\n{\n    Assert::allIsArray($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrIsArray(mixed $value): iterable\n{\n    Assert::allNullOrIsArray($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-isArrayAccessible.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse ArrayAccess;\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction isArrayAccessible(mixed $value): array|ArrayAccess\n{\n    Assert::isArrayAccessible($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction nullOrIsArrayAccessible(mixed $value): array|ArrayAccess|null\n{\n    Assert::nullOrIsArrayAccessible($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allIsArrayAccessible(mixed $value): iterable\n{\n    Assert::allIsArrayAccessible($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrIsArrayAccessible(mixed $value): iterable\n{\n    Assert::allNullOrIsArrayAccessible($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-isCallable.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction isCallable(mixed $value): callable\n{\n    Assert::isCallable($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction nullOrIsCallable(mixed $value): ?callable\n{\n    Assert::nullOrIsCallable($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allIsCallable(mixed $value): iterable\n{\n    Assert::allIsCallable($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrIsCallable(mixed $value): iterable\n{\n    Assert::allNullOrIsCallable($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-isCountable.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse countable;\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction isCountable(mixed $value): Countable\n{\n    Assert::isCountable($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction nullOrIsCountable(mixed $value): ?Countable\n{\n    Assert::nullOrIsCountable($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return iterable<countable>\n */\nfunction allIsCountable(mixed $value)\n{\n    Assert::allIsCountable($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return iterable<countable|null>\n */\nfunction allNullOrIsCountable(mixed $value)\n{\n    Assert::allNullOrIsCountable($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-isEmpty.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n */\nfunction isEmptyNullableObject(?object $value): null\n{\n    Assert::isEmpty($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @return \"\"|\"0\"\n */\nfunction isEmptyString(string $value)\n{\n    Assert::isEmpty($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @return (0)\n */\nfunction isEmptyInt(int $value)\n{\n    Assert::isEmpty($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @return false\n */\nfunction isEmptyBool(bool $value)\n{\n    Assert::isEmpty($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @return array<empty, empty>\n */\nfunction isEmptyArray(array $value)\n{\n    Assert::isEmpty($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @return null|empty\n */\nfunction nullOrIsEmpty(?object $value)\n{\n    Assert::nullOrIsEmpty($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allIsEmpty(mixed $value): iterable\n{\n    Assert::allIsEmpty($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrIsEmpty(mixed $value): iterable\n{\n    Assert::allNullOrIsEmpty($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-isInitialized.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param object $value\n */\nfunction isInitialized(mixed $value, string $property): object\n{\n    Assert::isInitialized($value, $property);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-isInstanceOf.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Serializable;\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction isInstanceOf(mixed $value): Serializable\n{\n    Assert::isInstanceOf($value, Serializable::class);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction nullOrIsInstanceOf(mixed $value): ?Serializable\n{\n    Assert::nullOrIsInstanceOf($value, Serializable::class);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allIsInstanceOf(mixed $value): iterable\n{\n    Assert::allIsInstanceOf($value, Serializable::class);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrIsInstanceOf(mixed $value): iterable\n{\n    Assert::allNullOrIsInstanceOf($value, Serializable::class);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-isInstanceOfAny.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @param mixed $value\n * @param array<class-string> $classes\n */\nfunction isInstanceOfAny($value, array $classes): mixed\n{\n    Assert::isInstanceOfAny($value, $classes);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n * @param array<class-string> $classes\n */\nfunction nullOrIsInstanceOfAny($value, array $classes): mixed\n{\n    Assert::nullOrIsInstanceOfAny($value, $classes);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n * @param array<class-string> $classes\n */\nfunction allIsInstanceOfAny($value, array $classes): mixed\n{\n    Assert::allIsInstanceOfAny($value, $classes);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n * @param array<class-string> $classes\n */\nfunction allNullOrIsInstanceOfAny($value, array $classes): mixed\n{\n    Assert::allNullOrIsInstanceOfAny($value, $classes);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-isIterable.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction isIterable(mixed $value): iterable\n{\n    Assert::isIterable($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction nullOrIsIterable(mixed $value): ?iterable\n{\n    Assert::nullOrIsIterable($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allIsIterable(mixed $value): iterable\n{\n    Assert::allIsIterable($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrIsIterable(mixed $value): iterable\n{\n    Assert::allNullOrIsIterable($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-isList.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse stdClass;\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return list<mixed>\n */\nfunction isList(mixed $value): array\n{\n    Assert::isList($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param array<stdClass> $value\n *\n * @return list<stdClass>\n */\nfunction isListWithKnownType(array $value): array\n{\n    Assert::isList($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return null|list<mixed>\n */\nfunction nullOrIsList(mixed $value): ?array\n{\n    Assert::nullOrIsList($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allIsList(mixed $value): iterable\n{\n    Assert::allIsList($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrIsList(mixed $value): iterable\n{\n    Assert::allNullOrIsList($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-isMap.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse stdClass;\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return array<string, mixed>\n */\nfunction isMap(mixed $value): array\n{\n    Assert::isMap($value);\n\n    return $value;\n}\n\n/**\n * Verifying that the type of the elements in the array is preserved by the assertion\n *\n * @psalm-pure\n *\n * @param array<int|string, stdClass> $value\n *\n * @return array<string, stdClass>\n */\nfunction isMapWithKnownType(array $value): array\n{\n    Assert::isMap($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param array<int|string, mixed> $value\n *\n * @return array<empty, empty>\n */\nfunction isMapWithEmptyArray(array $value): array\n{\n    Assert::isMap($value);\n    Assert::isEmpty($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return null|array<string, mixed>\n */\nfunction nullOrIsMap(mixed $value): ?array\n{\n    Assert::nullOrIsMap($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<mixed|array<mixed>> $value\n */\nfunction allIsMap(iterable $value): iterable\n{\n    Assert::allIsMap($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<mixed|array<mixed>> $value\n */\nfunction allNullOrIsMap(iterable $value): iterable\n{\n    Assert::allNullOrIsMap($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-isNonEmptyList.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return non-empty-list<mixed>\n */\nfunction isNonEmptyList(mixed $value): array\n{\n    Assert::isNonEmptyList($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n */\nfunction isNonEmptyListWithRange(): mixed\n{\n    $value = range(1, 100);\n\n    Assert::isNonEmptyList($value);\n\n    return $value[0];\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return null|non-empty-list<mixed>\n */\nfunction nullOrIsNonEmptyList(mixed $value): ?array\n{\n    Assert::nullOrIsNonEmptyList($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allIsNonEmptyList(mixed $value): iterable\n{\n    Assert::allIsNonEmptyList($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrIsNonEmptyList(mixed $value): iterable\n{\n    Assert::allNullOrIsNonEmptyList($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-isNonEmptyMap.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse stdClass;\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return non-empty-array<string, mixed>\n */\nfunction isNonEmptyMap(mixed $value): array\n{\n    Assert::isNonEmptyMap($value);\n\n    return $value;\n}\n\n/**\n * Verifying that the type of the elements in the array is preserved by the assertion\n *\n * @psalm-pure\n *\n * @param array<int|string, stdClass> $value\n *\n * @return array<string, stdClass>\n */\nfunction isNonEmptyMapWithKnownType(array $value): array\n{\n    Assert::isNonEmptyMap($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction nullOrIsNonEmptyMap(mixed $value): mixed\n{\n    Assert::nullOrIsNonEmptyMap($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<mixed|array<mixed>> $value\n */\nfunction allIsNonEmptyMap(iterable $value): iterable\n{\n    Assert::allIsNonEmptyMap($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<mixed|array<mixed>> $value\n */\nfunction allNullOrIsNonEmptyMap(iterable $value): iterable\n{\n    Assert::allNullOrIsNonEmptyMap($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-isNotA.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse DateTime;\nuse stdClass;\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param stdClass|DateTime $value\n */\nfunction isNotA(object $value): stdClass\n{\n    Assert::isNotA($value, DateTime::class);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param null|object|string $value\n * @param class-string<object> $class\n */\nfunction nullOrIsNotA($value, $class): object|string|null\n{\n    Assert::nullOrIsNotA($value, $class);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<object|string> $value\n * @param class-string<object> $class\n */\nfunction allIsNotA($value, $class): iterable\n{\n    Assert::allIsNotA($value, $class);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<object|string|null> $value\n * @param class-string<object> $class\n */\nfunction allNullOrIsNotA($value, $class): iterable\n{\n    Assert::allNullOrIsNotA($value, $class);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-isStatic.php",
    "content": "<?php\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Closure;\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @return Closure|callable-string\n */\nfunction isStatic(mixed $closure): Closure|string\n{\n    return Assert::isStatic($closure);\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-keyExists.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param array-key $key\n */\nfunction keyExists(array $array, $key): array\n{\n    Assert::keyExists($array, $key);\n\n    return $array;\n}\n\n/**\n * @psalm-pure\n *\n * @param array-key $key\n */\nfunction nullOrKeyExists(?array $array, $key): ?array\n{\n    Assert::nullOrKeyExists($array, $key);\n\n    return $array;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<array> $array\n * @param array-key $key\n */\nfunction allKeyExists(iterable $array, $key): iterable\n{\n    Assert::allKeyExists($array, $key);\n\n    return $array;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<array|null> $array\n * @param array-key $key\n */\nfunction allNullOrKeyExists(iterable $array, $key): iterable\n{\n    Assert::allNullOrKeyExists($array, $key);\n\n    return $array;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-keyNotExists.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param array-key $key\n */\nfunction keyNotExists(array $array, $key): array\n{\n    Assert::keyNotExists($array, $key);\n\n    return $array;\n}\n\n/**\n * @psalm-pure\n *\n * @param array-key $key\n */\nfunction nullOrKeyNotExists(?array $array, $key): ?array\n{\n    Assert::nullOrKeyNotExists($array, $key);\n\n    return $array;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<array> $array\n * @param array-key $key\n */\nfunction allKeyNotExists(iterable $array, $key): iterable\n{\n    Assert::allKeyNotExists($array, $key);\n\n    return $array;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<array|null> $array\n * @param array-key $key\n */\nfunction allNullOrKeyNotExists(iterable $array, $key): iterable\n{\n    Assert::allNullOrKeyNotExists($array, $key);\n\n    return $array;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-length.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n */\nfunction length(string $value, int $length): string\n{\n    Assert::length($value, $length);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n */\nfunction nullOrLength(?string $value, int $length): ?string\n{\n    Assert::nullOrLength($value, $length);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string> $value\n */\nfunction allLength(iterable $value, int $length): iterable\n{\n    Assert::allLength($value, $length);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string|null> $value\n */\nfunction allNullOrLength(iterable $value, int $length): iterable\n{\n    Assert::allNullOrLength($value, $length);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-lengthBetween.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n */\nfunction lengthBetween(string $value, int $min, int $max): string\n{\n    Assert::lengthBetween($value, $min, $max);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n */\nfunction nullOrLengthBetween(?string $value, int $min, int $max): ?string\n{\n    Assert::nullOrLengthBetween($value, $min, $max);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string> $value\n *\n * @return iterable<string>\n */\nfunction allLengthBetween(iterable $value, int $min, int $max): iterable\n{\n    Assert::allLengthBetween($value, $min, $max);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string|null> $value\n *\n * @return iterable<string|null>\n */\nfunction allNullOrLengthBetween(iterable $value, int $min, int $max): iterable\n{\n    Assert::allNullOrLengthBetween($value, $min, $max);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-lessThan.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param mixed $limit\n */\nfunction lessThan($value, $limit): mixed\n{\n    Assert::lessThan($value, $limit);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param mixed $limit\n */\nfunction nullOrLessThan($value, $limit): mixed\n{\n    Assert::nullOrLessThan($value, $limit);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param mixed $limit\n */\nfunction allLessThan($value, $limit): mixed\n{\n    Assert::allLessThan($value, $limit);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param mixed $limit\n */\nfunction allNullOrLessThan($value, $limit): mixed\n{\n    Assert::allNullOrLessThan($value, $limit);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-lessThanEq.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param mixed $limit\n */\nfunction lessThanEq($value, $limit): mixed\n{\n    Assert::lessThanEq($value, $limit);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param mixed $limit\n */\nfunction nullOrLessThanEq($value, $limit): mixed\n{\n    Assert::nullOrLessThanEq($value, $limit);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param mixed $limit\n */\nfunction allLessThanEq($value, $limit): mixed\n{\n    Assert::allLessThanEq($value, $limit);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param mixed $limit\n */\nfunction allNullOrLessThanEq($value, $limit): mixed\n{\n    Assert::allNullOrLessThanEq($value, $limit);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-lower.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @return lowercase-string\n */\nfunction lower(string $value): string\n{\n    Assert::lower($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @return null|lowercase-string\n */\nfunction nullOrLower(?string $value): ?string\n{\n    Assert::nullOrLower($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string> $value\n */\nfunction allLower(iterable $value): iterable\n{\n    Assert::allLower($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string|null> $value\n */\nfunction allNullOrLower(iterable $value): iterable\n{\n    Assert::allNullOrLower($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-maxCount.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Countable;\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @param Countable|array $array\n * @param int|float $max\n */\nfunction maxCount($array, $max): Countable|array\n{\n    Assert::maxCount($array, $max);\n\n    return $array;\n}\n\n/**\n * @param null|Countable|array $array\n * @param int|float $max\n */\nfunction nullOrMaxCount($array, $max): Countable|array|null\n{\n    Assert::nullOrMaxCount($array, $max);\n\n    return $array;\n}\n\n/**\n * @param iterable<Countable|array> $array\n * @param int|float $max\n */\nfunction allMaxCount(iterable $array, $max): iterable\n{\n    Assert::allMaxCount($array, $max);\n\n    return $array;\n}\n\n/**\n * @param iterable<Countable|array|null> $array\n * @param int|float $max\n */\nfunction allNullOrMaxCount(iterable $array, $max): iterable\n{\n    Assert::allNullOrMaxCount($array, $max);\n\n    return $array;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-maxLength.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n */\nfunction maxLength(string $value, int $max): string\n{\n    Assert::maxLength($value, $max);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n */\nfunction nullOrMaxLength(?string $value, int $max): ?string\n{\n    Assert::nullOrMaxLength($value, $max);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string> $value\n *\n * @return iterable<string>\n */\nfunction allMaxLength(iterable $value, int $max): iterable\n{\n    Assert::allMaxLength($value, $max);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string|null> $value\n *\n * @return iterable<string|null>\n */\nfunction allNullOrMaxLength(iterable $value, int $max): iterable\n{\n    Assert::allMaxLength($value, $max);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-methodExists.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param class-string|object $classOrObject\n * @param mixed $method\n */\nfunction methodExists($classOrObject, $method): string|object\n{\n    Assert::methodExists($classOrObject, $method);\n\n    return $classOrObject;\n}\n\n/**\n * @psalm-pure\n *\n * @param null|class-string|object $classOrObject\n * @param mixed $method\n */\nfunction nullOrMethodExists($classOrObject, $method): string|object|null\n{\n    Assert::nullOrMethodExists($classOrObject, $method);\n\n    return $classOrObject;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<class-string|object> $classOrObject\n * @param mixed $method\n */\nfunction allMethodExists(iterable $classOrObject, $method): iterable\n{\n    Assert::allMethodExists($classOrObject, $method);\n\n    return $classOrObject;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<class-string|object|null> $classOrObject\n * @param mixed $method\n */\nfunction allNullOrMethodExists(iterable $classOrObject, $method): iterable\n{\n    Assert::allNullOrMethodExists($classOrObject, $method);\n\n    return $classOrObject;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-methodNotExists.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param class-string|object $classOrObject\n * @param mixed $method\n */\nfunction methodNotExists($classOrObject, $method): string|object\n{\n    Assert::methodNotExists($classOrObject, $method);\n\n    return $classOrObject;\n}\n\n/**\n * @psalm-pure\n *\n * @param null|class-string|object $classOrObject\n * @param mixed $method\n */\nfunction nullOrMethodNotExists($classOrObject, $method): string|object|null\n{\n    Assert::nullOrMethodNotExists($classOrObject, $method);\n\n    return $classOrObject;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<class-string|object> $classOrObject\n * @param mixed $method\n */\nfunction allMethodNotExists(iterable $classOrObject, $method): iterable\n{\n    Assert::allMethodNotExists($classOrObject, $method);\n\n    return $classOrObject;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<class-string|object|null> $classOrObject\n * @param mixed $method\n */\nfunction allNullOrMethodNotExists(iterable $classOrObject, $method): iterable\n{\n    Assert::allNullOrMethodNotExists($classOrObject, $method);\n\n    return $classOrObject;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-minCount.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Countable;\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @param Countable|array $array\n * @param int|float $min\n */\nfunction minCount($array, $min): Countable|array\n{\n    Assert::minCount($array, $min);\n\n    return $array;\n}\n\n/**\n * @param null|Countable|array $array\n * @param int|float $min\n */\nfunction nullOrMinCount($array, $min): Countable|array|null\n{\n    Assert::nullOrMinCount($array, $min);\n\n    return $array;\n}\n\n/**\n * @param iterable<Countable|array> $array\n * @param int|float $min\n *\n * @return iterable<Countable|array>\n */\nfunction allMinCount($array, $min)\n{\n    Assert::allMinCount($array, $min);\n\n    return $array;\n}\n\n/**\n * @param iterable<Countable|array|null> $array\n * @param int|float $min\n *\n * @return iterable<Countable|array|null>\n */\nfunction allNullOrMinCount($array, $min)\n{\n    Assert::allNullOrMinCount($array, $min);\n\n    return $array;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-minLength.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param int|float $min\n */\nfunction minLength(string $value, $min): string\n{\n    Assert::minLength($value, $min);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param int|float $min\n */\nfunction nullOrMinLength(?string $value, $min): ?string\n{\n    Assert::nullOrMinLength($value, $min);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string> $value\n * @param int|float $min\n */\nfunction allMinLength(iterable $value, $min): iterable\n{\n    Assert::allMinLength($value, $min);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string|null> $value\n * @param int|float $min\n */\nfunction allNullOrMinLength(iterable $value, $min): iterable\n{\n    Assert::allNullOrMinLength($value, $min);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-natural.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @psalm-return positive-int|0\n */\nfunction natural(mixed $value): int\n{\n    Assert::natural($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @psalm-return positive-int|0|null\n */\nfunction nullOrNatural(mixed $value): ?int\n{\n    Assert::nullOrNatural($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * *\n * @psalm-suppress MixedInferredReturnType https://github.com/vimeo/psalm/issues/5052\n * @psalm-suppress MixedReturnStatement https://github.com/vimeo/psalm/issues/5052\n */\nfunction allNatural(mixed $value): iterable\n{\n    Assert::allNatural($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * *\n * @psalm-suppress MixedInferredReturnType https://github.com/vimeo/psalm/issues/5052\n * @psalm-suppress MixedReturnStatement https://github.com/vimeo/psalm/issues/5052\n */\nfunction allNullOrNatural(mixed $value): iterable\n{\n    Assert::allNullOrNatural($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-negativeInteger.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @psalm-return negative-int\n */\nfunction negativeInteger(mixed $value): int\n{\n    Assert::negativeInteger($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @psalm-return negative-int|null\n */\nfunction nullOrNegativeInteger(mixed $value): ?int\n{\n    Assert::nullOrNegativeInteger($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return iterable<negative-int>\n */\nfunction allNegativeInteger(mixed $value): iterable\n{\n    Assert::allNegativeInteger($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return iterable<negative-int|null>\n */\nfunction allNullOrNegativeInteger(mixed $value): iterable\n{\n    Assert::allNullOrNegativeInteger($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-notContains.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n */\nfunction notContains(string $value, string $subString): string\n{\n    Assert::notContains($value, $subString);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n */\nfunction nullOrNotContains(?string $value, string $subString): ?string\n{\n    Assert::nullOrNotContains($value, $subString);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string> $value\n */\nfunction allNotContains(iterable $value, string $subString): iterable\n{\n    Assert::allNotContains($value, $subString);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string|null> $value\n */\nfunction allNullOrNotContains(iterable $value, string $subString): iterable\n{\n    Assert::allNullOrNotContains($value, $subString);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-notEmpty.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n */\nfunction notEmptyNullableObject(?object $value): object\n{\n    Assert::notEmpty($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @return non-empty-string\n */\nfunction notEmptyString(string $value)\n{\n    Assert::notEmpty($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @return true\n */\nfunction notEmptyBool(bool $value)\n{\n    Assert::notEmpty($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @return non-empty-array\n */\nfunction notEmptyArray(array $value)\n{\n    Assert::notEmpty($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction nullOrNotEmpty(mixed $value): mixed\n{\n    Assert::nullOrNotEmpty($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNotEmpty(mixed $value): mixed\n{\n    Assert::allNotEmpty($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrNotEmpty(mixed $value): mixed\n{\n    Assert::allNullOrNotEmpty($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-notEq.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @param mixed $value\n * @param mixed $expect\n */\nfunction notEq($value, $expect): mixed\n{\n    Assert::notEq($value, $expect);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n * @param mixed $expect\n */\nfunction nullOrNotEq($value, $expect): mixed\n{\n    Assert::nullOrNotEq($value, $expect);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n * @param mixed $expect\n */\nfunction allNotEq($value, $expect): mixed\n{\n    Assert::allNotEq($value, $expect);\n\n    return $value;\n}\n\n/**\n * @param mixed $value\n * @param mixed $expect\n */\nfunction allNullOrNotEq($value, $expect): mixed\n{\n    Assert::allNullOrNotEq($value, $expect);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-notFalse.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @return true\n */\nfunction notFalseBool(bool $value): bool\n{\n    Assert::notFalse($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param false|string $value\n */\nfunction notFalseUnion(mixed $value): string\n{\n    Assert::notFalse($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction nullOrNotFalse(mixed $value): mixed\n{\n    Assert::nullOrNotFalse($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNotFalse(mixed $value): mixed\n{\n    Assert::allNotFalse($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrNotFalse(mixed $value): mixed\n{\n    Assert::allNullOrNotFalse($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-notInArray.php",
    "content": "<?php\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n */\nfunction notInArray(mixed $value, array $values): mixed\n{\n    Assert::notInArray($value, $values);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n */\nfunction nullOrNotInArray(mixed $value, array $values): mixed\n{\n    Assert::nullOrNotInArray($value, $values);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n */\nfunction allNotInArray(mixed $value, array $values): mixed\n{\n    Assert::allNotInArray($value, $values);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-notInstanceOf.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse DateTime;\nuse stdClass;\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @param stdClass|DateTime $value\n */\nfunction notInstanceOf(mixed $value): DateTime\n{\n    Assert::notInstanceOf($value, stdClass::class);\n\n    return $value;\n}\n\n/**\n * @psalm-template T of object\n *\n * @param mixed $value\n * @param class-string<T> $class\n */\nfunction nullOrNotInstanceOf($value, $class): mixed\n{\n    Assert::nullOrNotInstanceOf($value, $class);\n\n    return $value;\n}\n\n/**\n * @psalm-template T of object\n *\n * @param mixed $value\n * @param class-string<T> $class\n */\nfunction allNotInstanceOf($value, $class): mixed\n{\n    Assert::allNotInstanceOf($value, $class);\n\n    return $value;\n}\n\n/**\n * @psalm-template T of object\n *\n * @param mixed $value\n * @param class-string<T> $class\n */\nfunction allNullOrNotInstanceOf($value, $class): mixed\n{\n    Assert::allNullOrNotInstanceOf($value, $class);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-notNegativeInteger.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @psalm-return non-negative-int\n */\nfunction nonNegativeInteger(mixed $value): int\n{\n    Assert::notNegativeInteger($value);\n\n    $value *= -1;\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @psalm-return non-negative-int|null\n */\nfunction nullOrNonNegativeInteger(mixed $value): ?int\n{\n    Assert::nullOrNotNegativeInteger($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return iterable<non-negative-int>\n */\nfunction allNonNegativeInteger(mixed $value): iterable\n{\n    Assert::allNotNegativeInteger($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return iterable<non-negative-int|null>\n */\nfunction allNullOrNonNegativeInteger(mixed $value): iterable\n{\n    Assert::allNullOrPositiveInteger($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-notNull.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n */\nfunction notNull(?object $value): object\n{\n    Assert::notNull($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNotNull(mixed $value): mixed\n{\n    Assert::allNotNull($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-notOneOf.php",
    "content": "<?php\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n */\nfunction notOneOf(mixed $value, array $values): mixed\n{\n    Assert::notOneOf($value, $values);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n */\nfunction nullOrNotOneOf(mixed $value, array $values): mixed\n{\n    Assert::nullOrNotOneOf($value, $values);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n */\nfunction allNotOneOf(mixed $value, array $values): mixed\n{\n    Assert::allNotOneOf($value, $values);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-notRegex.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n */\nfunction notRegex(string $value, string $pattern): string\n{\n    Assert::notRegex($value, $pattern);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n */\nfunction nullOrNotRegex(?string $value, string $pattern): ?string\n{\n    Assert::nullOrNotRegex($value, $pattern);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string> $value\n */\nfunction allNotRegex(iterable $value, string $pattern): iterable\n{\n    Assert::allNotRegex($value, $pattern);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string|null> $value\n */\nfunction allNullOrNotRegex(iterable $value, string $pattern): iterable\n{\n    Assert::allNotRegex($value, $pattern);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-notSame.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param mixed $expect\n */\nfunction notSame($value, $expect): mixed\n{\n    Assert::notSame($value, $expect);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param mixed $expect\n */\nfunction nullOrNotSame($value, $expect): mixed\n{\n    Assert::nullOrNotSame($value, $expect);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param mixed $expect\n */\nfunction allNotSame($value, $expect): mixed\n{\n    Assert::allNotSame($value, $expect);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param mixed $expect\n */\nfunction allNullOrNotSame($value, $expect): mixed\n{\n    Assert::allNullOrNotSame($value, $expect);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-notStatic.php",
    "content": "<?php\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Closure;\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @return Closure|callable-string\n */\nfunction notStatic(mixed $closure): Closure|string\n{\n    return Assert::notStatic($closure);\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-notWhitespaceOnly.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n */\nfunction notWhitespaceOnly(string $value): string\n{\n    Assert::notWhitespaceOnly($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n */\nfunction nullOrNotWhitespaceOnly(?string $value): ?string\n{\n    Assert::nullOrNotWhitespaceOnly($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string> $value\n */\nfunction allNotWhitespaceOnly(iterable $value): iterable\n{\n    Assert::allNotWhitespaceOnly($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string|null> $value\n */\nfunction allNullOrNotWhitespaceOnly(iterable $value): iterable\n{\n    Assert::allNullOrNotWhitespaceOnly($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-null.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction null(mixed $value): null\n{\n    Assert::null($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNull(mixed $value): iterable\n{\n    Assert::allNull($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-numeric.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return numeric\n */\nfunction numeric(mixed $value)\n{\n    Assert::numeric($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return null|numeric\n */\nfunction nullOrNumeric(mixed $value)\n{\n    Assert::nullOrNumeric($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNumeric(mixed $value): iterable\n{\n    Assert::allNumeric($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrNumeric(mixed $value): iterable\n{\n    Assert::allNullOrNumeric($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-object.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction object(mixed $value): object\n{\n    Assert::object($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction nullOrObject(mixed $value): ?object\n{\n    Assert::nullOrObject($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allObject(mixed $value): iterable\n{\n    Assert::allObject($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrObject(mixed $value): iterable\n{\n    Assert::allNullOrObject($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-objectish.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction objectish(mixed $value): object|string\n{\n    Assert::objectish($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction nullOrObjectish(mixed $value): object|string|null\n{\n    Assert::nullOrObjectish($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allObjectish(mixed $value): iterable\n{\n    Assert::allObjectish($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrObjectish(mixed $value): iterable\n{\n    Assert::allNullOrObjectish($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-oneOf.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction oneOf($value, array $values): mixed\n{\n    Assert::oneOf($value, $values);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction nullOrOneOf($value, array $values): mixed\n{\n    Assert::nullOrOneOf($value, $values);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allOneOf($value, array $values): mixed\n{\n    Assert::allOneOf($value, $values);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrOneOf($value, array $values): mixed\n{\n    Assert::allNullOrOneOf($value, $values);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-positiveInteger.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @psalm-return positive-int\n */\nfunction positiveInteger(mixed $value): int\n{\n    Assert::positiveInteger($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param 0|1|2 $value\n *\n * @psalm-return 1|2\n */\nfunction positiveIntegerFiltersOutZero(mixed $value): int\n{\n    Assert::positiveInteger($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @psalm-return positive-int|null\n */\nfunction nullOrPositiveInteger(mixed $value): ?int\n{\n    Assert::nullOrPositiveInteger($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allPositiveInteger(mixed $value): iterable\n{\n    Assert::allPositiveInteger($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrPositiveInteger(mixed $value): iterable\n{\n    Assert::allPositiveInteger($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-propertyExists.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param class-string|object $classOrObject\n * @param mixed $property\n */\nfunction propertyExists($classOrObject, $property): string|object\n{\n    Assert::propertyExists($classOrObject, $property);\n\n    return $classOrObject;\n}\n\n/**\n * @psalm-pure\n *\n * @param null|class-string|object $classOrObject\n * @param mixed $property\n */\nfunction nullOrPropertyExists($classOrObject, $property): string|object|null\n{\n    Assert::nullOrPropertyExists($classOrObject, $property);\n\n    return $classOrObject;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<class-string|object> $classOrObject\n * @param mixed $property\n */\nfunction allPropertyExists(iterable $classOrObject, $property): iterable\n{\n    Assert::allPropertyExists($classOrObject, $property);\n\n    return $classOrObject;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<class-string|object|null> $classOrObject\n * @param mixed $property\n */\nfunction allNullOrPropertyExists(iterable $classOrObject, $property): iterable\n{\n    Assert::allPropertyExists($classOrObject, $property);\n\n    return $classOrObject;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-propertyNotExists.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param class-string|object $classOrObject\n * @param mixed $property\n */\nfunction propertyNotExists($classOrObject, $property): string|object\n{\n    Assert::propertyNotExists($classOrObject, $property);\n\n    return $classOrObject;\n}\n\n/**\n * @psalm-pure\n *\n * @param null|class-string|object $classOrObject\n * @param mixed $property\n */\nfunction nullOrPropertyNotExists($classOrObject, $property): string|object|null\n{\n    Assert::nullOrPropertyNotExists($classOrObject, $property);\n\n    return $classOrObject;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<class-string|object> $classOrObject\n * @param mixed $property\n */\nfunction allPropertyNotExists(iterable $classOrObject, $property): iterable\n{\n    Assert::allPropertyNotExists($classOrObject, $property);\n\n    return $classOrObject;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<class-string|object|null> $classOrObject\n * @param mixed $property\n */\nfunction allNullOrPropertyNotExists(iterable $classOrObject, $property): iterable\n{\n    Assert::allNullOrPropertyNotExists($classOrObject, $property);\n\n    return $classOrObject;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-psalm-notRedundant.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @see https://github.com/webmozart/assert/pull/160#issuecomment-564491986\n * @see https://github.com/vimeo/psalm/commit/4b715cdbffea19a7eab6f72482027d2dd358aab2\n * @see https://github.com/vimeo/psalm/issues/2456\n */\nfunction stringWillNotBeRedundantIfAssertingAndNotUsingEither(mixed $value): bool\n{\n    Assert::string($value);\n\n    return true;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-psalm-preserveContainerType.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse ArrayIterator;\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed[] $value\n *\n * @return string[]\n */\nfunction preserveContainerAllArray(mixed $value): iterable\n{\n    Assert::allString($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param ArrayIterator<string, mixed> $value\n *\n * @return ArrayIterator<string, string>\n */\nfunction preserveContainerAllArrayIterator(mixed $value)\n{\n    Assert::allString($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-psalm-preserveStringType.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param non-empty-string $value\n *\n * @return non-empty-string\n */\nfunction lowerPreservesTypes(string $value): string\n{\n    Assert::lower($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-range.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param mixed $min\n * @param mixed $max\n */\nfunction range($value, $min, $max): mixed\n{\n    Assert::range($value, $min, $max);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param mixed $min\n * @param mixed $max\n */\nfunction nullOrRange($value, $min, $max): mixed\n{\n    Assert::nullOrRange($value, $min, $max);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param mixed $min\n * @param mixed $max\n */\nfunction allRange($value, $min, $max): mixed\n{\n    Assert::allRange($value, $min, $max);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param mixed $min\n * @param mixed $max\n */\nfunction allNullOrRange($value, $min, $max): mixed\n{\n    Assert::allNullOrRange($value, $min, $max);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-readable.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\nfunction readable(string $value): string\n{\n    Assert::readable($value);\n\n    return $value;\n}\n\nfunction nullOrReadable(?string $value): ?string\n{\n    Assert::nullOrReadable($value);\n\n    return $value;\n}\n\n/**\n * @param iterable<string> $value\n */\nfunction allReadable(iterable $value): iterable\n{\n    Assert::allReadable($value);\n\n    return $value;\n}\n\n/**\n * @param iterable<string|null> $value\n */\nfunction allNullOrReadable(iterable $value): iterable\n{\n    Assert::allNullOrReadable($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-regex.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n */\nfunction regex(string $value, string $pattern): string\n{\n    Assert::regex($value, $pattern);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n */\nfunction nullOrRegex(?string $value, string $pattern): ?string\n{\n    Assert::nullOrRegex($value, $pattern);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string> $value\n */\nfunction allRegex(iterable $value, string $pattern): iterable\n{\n    Assert::allRegex($value, $pattern);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string|null> $value\n */\nfunction allNullOrRegex(iterable $value, string $pattern): iterable\n{\n    Assert::allRegex($value, $pattern);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-resource.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param null|string $type\n */\nfunction resource(mixed $value, ?string $type): mixed\n{\n    Assert::resource($value, $type);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param null|string $type\n */\nfunction nullOrResource(mixed $value, ?string $type): mixed\n{\n    Assert::nullOrResource($value, $type);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param null|string $type\n */\nfunction allResource($value, $type): iterable\n{\n    Assert::allResource($value, $type);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param null|string $type\n */\nfunction allNullOrResource($value, $type): iterable\n{\n    Assert::allNullOrResource($value, $type);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-same.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param mixed $expect\n */\nfunction same($value, $expect): mixed\n{\n    Assert::same($value, $expect);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param mixed $expect\n */\nfunction nullOrSame($value, $expect): mixed\n{\n    Assert::nullOrSame($value, $expect);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param mixed $expect\n */\nfunction allSame($value, $expect): mixed\n{\n    Assert::allSame($value, $expect);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n * @param mixed $expect\n */\nfunction allNullOrSame($value, $expect): mixed\n{\n    Assert::allNullOrSame($value, $expect);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-scalar.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction scalar(mixed $value): int|float|string|bool\n{\n    Assert::scalar($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction nullOrScalar(mixed $value): int|float|string|bool|null\n{\n    Assert::nullOrScalar($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allScalar(mixed $value): iterable\n{\n    Assert::allScalar($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrScalar(mixed $value): iterable\n{\n    Assert::allNullOrScalar($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-startsWith.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n */\nfunction startsWith(string $value, string $prefix): string\n{\n    Assert::startsWith($value, $prefix);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n */\nfunction nullOrStartsWith(?string $value, string $prefix): ?string\n{\n    Assert::nullOrStartsWith($value, $prefix);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string> $value\n */\nfunction allStartsWith(iterable $value, string $prefix): iterable\n{\n    Assert::allStartsWith($value, $prefix);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string|null> $value\n */\nfunction allNullOrStartsWith(iterable $value, string $prefix): iterable\n{\n    Assert::allNullOrStartsWith($value, $prefix);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-startsWithLetter.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction startsWithLetter($value, string $prefix): mixed\n{\n    Assert::startsWithLetter($value, $prefix);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction nullOrStartsWithLetter($value, string $prefix): mixed\n{\n    Assert::nullOrStartsWithLetter($value, $prefix);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allStartsWithLetter($value, string $prefix): mixed\n{\n    Assert::allStartsWithLetter($value, $prefix);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrStartsWithLetter($value, string $prefix): mixed\n{\n    Assert::allNullOrStartsWithLetter($value, $prefix);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-string.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction string(mixed $value): string\n{\n    Assert::string($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction nullOrString(mixed $value): ?string\n{\n    Assert::nullOrString($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allString(mixed $value): iterable\n{\n    Assert::allString($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrString(mixed $value): iterable\n{\n    Assert::allNullOrString($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-stringNotEmpty.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return non-empty-string\n */\nfunction stringNotEmpty(mixed $value): string\n{\n    Assert::stringNotEmpty($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return null|non-empty-string\n */\nfunction nullOrStringNotEmpty(mixed $value): ?string\n{\n    Assert::nullOrStringNotEmpty($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allStringNotEmpty(mixed $value): iterable\n{\n    Assert::allStringNotEmpty($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrStringNotEmpty(mixed $value): iterable\n{\n    Assert::allNullOrStringNotEmpty($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-subclassOf.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse stdClass;\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return class-string<stdClass>|stdClass\n */\nfunction subclassOf(mixed $value)\n{\n    Assert::subclassOf($value, stdClass::class);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return null|class-string<stdClass>|stdClass\n */\nfunction nullOrSubclassOf(mixed $value)\n{\n    Assert::nullOrSubclassOf($value, stdClass::class);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allSubclassOf(mixed $value): iterable\n{\n    Assert::allSubclassOf($value, stdClass::class);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrSubclassOf(mixed $value): iterable\n{\n    Assert::allNullOrSubclassOf($value, stdClass::class);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-throws.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Closure;\nuse Throwable;\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @param class-string<Throwable> $class\n */\nfunction throws(Closure $value, $class): Closure\n{\n    Assert::throws($value, $class);\n\n    return $value;\n}\n\n/**\n * @param class-string<Throwable> $class\n */\nfunction nullOrThrows(?Closure $value, $class): ?Closure\n{\n    Assert::nullOrThrows($value, $class);\n\n    return $value;\n}\n\n/**\n * @param iterable<Closure> $value\n * @param class-string<Throwable> $class\n */\nfunction allThrows(iterable $value, $class): iterable\n{\n    Assert::allThrows($value, $class);\n\n    return $value;\n}\n/**\n * @param iterable<Closure|null> $value\n * @param class-string<Throwable> $class\n */\nfunction allNullOrThrows(iterable $value, $class): iterable\n{\n    Assert::allNullOrThrows($value, $class);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-true.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return true\n */\nfunction true(mixed $value): bool\n{\n    Assert::true($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return null|true\n */\nfunction nullOrTrue(mixed $value): ?bool\n{\n    Assert::nullOrTrue($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allTrue(mixed $value): iterable\n{\n    Assert::allTrue($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrTrue(mixed $value): iterable\n{\n    Assert::allNullOrTrue($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-unicodeLetters.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction unicodeLetters(mixed $value): mixed\n{\n    Assert::unicodeLetters($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction nullOrUnicodeLetters(mixed $value): mixed\n{\n    Assert::nullOrUnicodeLetters($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allUnicodeLetters(mixed $value): mixed\n{\n    Assert::allUnicodeLetters($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrUnicodeLetters(mixed $value): mixed\n{\n    Assert::allNullOrUnicodeLetters($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-uniqueValues.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\nfunction uniqueValues(array $values): array\n{\n    Assert::uniqueValues($values);\n\n    return $values;\n}\n\nfunction nullOrUniqueValues(?array $values): ?array\n{\n    Assert::nullOrUniqueValues($values);\n\n    return $values;\n}\n\n/**\n * @param iterable<array> $values\n */\nfunction allUniqueValues(iterable $values): iterable\n{\n    Assert::allUniqueValues($values);\n\n    return $values;\n}\n\n/**\n * @param iterable<array|null> $values\n */\nfunction allNullOrUniqueValues(iterable $values): iterable\n{\n    Assert::allNullOrUniqueValues($values);\n\n    return $values;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-upper.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n */\nfunction upper(mixed $value): string\n{\n    Assert::upper($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n */\nfunction nullOrUpper(?string $value): ?string\n{\n    Assert::nullOrUpper($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string> $value\n */\nfunction allUpper(iterable $value): iterable\n{\n    Assert::allUpper($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string|null> $value\n */\nfunction allNullOrUpper(iterable $value): iterable\n{\n    Assert::allNullOrUpper($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-uuid.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n */\nfunction uuid(string $value): string\n{\n    Assert::uuid($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n */\nfunction nullOrUuid(?string $value): ?string\n{\n    Assert::nullOrUuid($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string> $value\n */\nfunction allUuid(iterable $value): iterable\n{\n    Assert::allUuid($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param iterable<string|null> $value\n */\nfunction allNullOrUuid(iterable $value): iterable\n{\n    Assert::allNullOrUuid($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-validArrayKey.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return array-key\n */\nfunction validArrayKey(mixed $value)\n{\n    Assert::validArrayKey($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n *\n * @return null|array-key\n */\nfunction nullOrValidArrayKey(mixed $value)\n{\n    Assert::nullOrValidArrayKey($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allValidArrayKey(mixed $value): iterable\n{\n    Assert::allValidArrayKey($value);\n\n    return $value;\n}\n\n/**\n * @psalm-pure\n *\n * @param mixed $value\n */\nfunction allNullOrValidArrayKey(mixed $value): iterable\n{\n    Assert::allNullOrValidArrayKey($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tests/static-analysis/assert-writable.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Webmozart\\Assert\\Tests\\StaticAnalysis;\n\nuse Webmozart\\Assert\\Assert;\n\nfunction writable(string $value): string\n{\n    Assert::writable($value);\n\n    return $value;\n}\n\nfunction nullOrWritable(?string $value): ?string\n{\n    Assert::nullOrWritable($value);\n\n    return $value;\n}\n\n/**\n * @param iterable<string> $value\n */\nfunction allWritable(iterable $value): iterable\n{\n    Assert::allWritable($value);\n\n    return $value;\n}\n\n/**\n * @param iterable<string|null> $value\n */\nfunction allNullOrWritable(iterable $value): iterable\n{\n    Assert::allNullOrWritable($value);\n\n    return $value;\n}\n"
  },
  {
    "path": "tools/php-cs-fixer/composer.json",
    "content": "{\n    \"require\": {\n        \"php\": \"^8.2\"\n    },\n    \"require-dev\": {\n        \"friendsofphp/php-cs-fixer\": \"^3.64\"\n    }\n}\n"
  },
  {
    "path": "tools/phpunit/composer.json",
    "content": "{\n    \"require\": {\n        \"php\": \"^8.2\"\n    },\n    \"require-dev\": {\n        \"phpunit/phpunit\": \"^11.0\"\n    }\n}\n"
  },
  {
    "path": "tools/psalm/composer.json",
    "content": "{\n    \"require\": {\n        \"php\": \"^8.2\"\n    },\n    \"require-dev\": {\n        \"vimeo/psalm\": \"^6.0\"\n    }\n}\n"
  },
  {
    "path": "tools/roave-bc-check/composer.json",
    "content": "{\n    \"require\": {\n        \"php\": \"^8.2\"\n    },\n    \"require-dev\": {\n        \"roave/backward-compatibility-check\": \"^8.10\"\n    }\n}\n"
  }
]