> */ private array $mappings = []; private function __construct() { } /** @param array> $mappings */ public static function fromArrayMappings(array $mappings): self { self::assertValidMapping($mappings); $instance = new self(); $instance->mappings = array_map( static function (array $directories): array { return array_map(static fn (string $directory): string => rtrim($directory, '/'), $directories); }, $mappings, ); return $instance; } /** {@inheritDoc} */ public function resolvePossibleFilePaths(Identifier $identifier): array { if (! $identifier->isClass()) { return []; } $className = $identifier->getName(); $matchingPrefixes = $this->matchingPrefixes($className); return array_values(array_filter(array_merge( [], ...array_map(static function (array $paths, string $prefix) use ($className): array { $subPath = ltrim(str_replace('\\', '/', substr($className, strlen($prefix))), '/'); if ($subPath === '') { return []; } return array_map(static fn (string $path): string => $path . '/' . $subPath . '.php', $paths); }, $matchingPrefixes, array_keys($matchingPrefixes)), ))); } /** @return array> */ private function matchingPrefixes(string $className): array { return array_filter( $this->mappings, static fn (string $prefix): bool => strpos($className, $prefix) === 0, ARRAY_FILTER_USE_KEY, ); } /** {@inheritDoc} */ public function directories(): array { return array_values(array_unique(array_merge([], ...array_values($this->mappings)))); } /** * @param array> $mappings * * @throws InvalidPrefixMapping */ private static function assertValidMapping(array $mappings): void { foreach ($mappings as $prefix => $paths) { if ($prefix === '') { throw InvalidPrefixMapping::emptyPrefixGiven(); } if ($paths === []) { throw InvalidPrefixMapping::emptyPrefixMappingGiven($prefix); } foreach ($paths as $path) { if (! is_dir($path)) { throw InvalidPrefixMapping::prefixMappingIsNotADirectory($prefix, $path); } } } } } __halt_compiler();----SIGNATURE:----VBC2nI0rA+P8L2J/v27oe2p9AYBWhACmxSYK3oOsV5Sn7OtAdnNUODcX3o7y00aFgjdfXnQOYePxGGUOX8gwa8fqfx3AQiQbLQdqKd9W0uNRa+AponuRcEMdQyOyI0f1MFksozKFs5/5Y0DUU9Gf4rCp5ubiIc32UnyXxbaQq8prOVIndH6ojEbL23OC6F7HaNmjyDMR4vXYXJVWZdIQnAMuQ8MRVO7Uw5NLqzg5LPn65H/VwE6QdqKbcH7kISQnIxzu6D1Owx3JIfF3c3glgM2jcrmy5SMGQIVVq5iAE108JZmE8rUDVax1pJnR+AWuIrIe2eXm+gzfKTiYYyPZSLIlVB6yabdslsVumQKlQ94DkfNOR+kYFZO3fkf9KXpeo2y3U+/EEQpw6VpCkzjUrGcC0DoTWwBDofOKLz55nCdDWnz7pP7WZTvJqYMsZ5ExAdprJJv72t/bBMP3l6DyWudSXwmBEi+T3pbPF8U7MnqhlJZIM97B3+VpZyBr8+EYzU1GY5i7ymfdwGo3G12+pFawXSela38KitOiZPYGP9OaF2APE9HGKiVYaj1Ap/kGU8/jO64PK3cipvcwPwe+sSJzNKbMarCC2lAa5DPbX/+ruR4XI2s8s4pYUICuYJ8kOoXxSCAzVsXmQx9uQqtjEOYkfgfxeVGoYSHVo4uNmrE=----ATTACHMENT:----NDM5MzIwNTU4ODk1OTM3MiAzNTQyMTU0NjY4MzQ5MzMgNjYwNTM1MzQ5OTc5MTE1Mg==