Replace local matcher with core package

This commit is contained in:
myrmidex 2026-08-22 19:56:24 +02:00
parent 47141cf4c0
commit 699279888a
5 changed files with 47 additions and 85 deletions

View file

@ -2,8 +2,8 @@
require __DIR__ . '/../autoload.php';
use Lvl0\AnagramFinder\Core\Matcher;
use Myrmidex\AnagramFinder\ArgHandler;
use Myrmidex\AnagramFinder\Matcher;
use Myrmidex\AnagramFinder\Output;
const DICTIONARY = __DIR__ . '/../assets/words.txt';
@ -22,5 +22,4 @@ $matches = Matcher::findWords($anagram, $minLength);
if ($top10) {
$matches = $matches->slice(0, 10);
}
$matches->each(fn (string $word) => Output::line($word . " (" . strlen($word) . ")"));
$matches->each(fn(string $word) => Output::line($word . " (" . strlen($word) . ")"));

View file

@ -1,8 +1,9 @@
{
"name": "myrmidex/anagram-finder",
"description": "An anagram finder in PHP",
"name": "anagram-finder/tui",
"description": "A TUI anagram finder in PHP",
"type": "project",
"require": {
"anagram-finder/core": "^0.1.0",
"illuminate/collections": "^13.26"
},
"license": "AGPL-3.0-only",
@ -21,5 +22,11 @@
"require-dev": {
"phpunit/phpunit": "^13",
"friendsofphp/php-cs-fixer": "^3.95"
}
},
"repositories": [
{
"type": "vcs",
"url": "ssh://git@forge.lvl0.xyz:2222/anagram-finder/core.git"
}
]
}

36
composer.lock generated
View file

@ -4,8 +4,42 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "fda7b586750778a7250234cef7e8462d",
"content-hash": "c36dc53654ea02e67b64da57d7bc91f3",
"packages": [
{
"name": "anagram-finder/core",
"version": "v0.1.0",
"source": {
"type": "git",
"url": "ssh://git@forge.lvl0.xyz:2222/anagram-finder/core.git",
"reference": "4b8ce74729fa9a6d0ca91c5d661256ca256e5291"
},
"require": {
"illuminate/collections": "^13.26"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.95",
"phpunit/phpunit": "^13"
},
"type": "library",
"autoload": {
"psr-4": {
"Lvl0\\AnagramFinder\\Core\\": "src/",
"Lvl0\\AnagramFinder\\Core\\Tests\\": "tests/"
}
},
"license": [
"AGPL-3.0-only"
],
"authors": [
{
"name": "myrmidex",
"email": "myrmidex@myrmidex.net"
}
],
"description": "AnagramFinder core",
"time": "2026-08-22T17:50:27+00:00"
},
{
"name": "illuminate/collections",
"version": "v13.26.1",

View file

@ -1,51 +0,0 @@
<?php
namespace Myrmidex\AnagramFinder;
use Illuminate\Support\Collection;
use Illuminate\Support\LazyCollection;
class Matcher
{
public static function findWords(string $anagram, int $minLength = 3): Collection
{
$matches = self::getWordList()
->filter(fn (string $word) => strlen($word) >= $minLength)
->filter(fn (string $word) => ctype_alpha($word))
->filter(fn (string $word) => $word === strtolower($word))
->filter(fn (string $word) => self::check($anagram, $word))
->toArray();
return new Collection($matches)
->sort(fn ($a, $b) => strlen($b) - strlen($a));
}
public static function check(string $anagram, string $word): bool
{
$pool = array_count_values(str_split($anagram));
foreach (str_split($word) as $char) {
if (($pool[$char] ?? 0) === 0) {
return false;
}
$pool[$char]--;
}
return true;
}
private static function getWordList(): LazyCollection
{
return LazyCollection::make(function () {
$fh = fopen(DICTIONARY, 'rb');
try {
while (($line = fgets($fh)) !== false) {
yield rtrim($line, "\r\n");
}
} finally {
fclose($fh);
}
});
}
}

View file

@ -1,27 +0,0 @@
<?php
namespace Myrmidex\AnagramFinder\Tests\Unit;
use Myrmidex\AnagramFinder\Matcher;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\TestCase;
final class MatcherTest extends TestCase
{
#[DataProvider('checkProvider')]
public function testCheck(string $anagram, string $word, bool $isExpectedMatch)
{
$this->assertEquals($isExpectedMatch, Matcher::check($anagram, $word));
}
public static function checkProvider(): array
{
return [
'valid1' => [ "eamstoxil", "steam", true ],
'valid2' => [ "wordneoxs", "downers", true ],
'valid3' => [ "ioevpmoef", "movie", true ],
'invalid_basic' => [ "eamstoxil", "smear", false],
'invalid_double_e' => [ "eamstexil", "smear", false],
];
}
}