Skip to content

feat: sort_by を追加する - #77

Open
Javakky wants to merge 1 commit into
masterfrom
javakky/sort-by
Open

feat: sort_by を追加する#77
Javakky wants to merge 1 commit into
masterfrom
javakky/sort-by

Conversation

@Javakky

@Javakky Javakky commented Jul 27, 2026

Copy link
Copy Markdown
Collaborator

概要(What / Why)

selector が返す比較キーで昇順ソートする sort_by を追加します。
親 issue #56 の breakdown で挙がっていた基本操作で、usort のコンパレータを毎回書かずに済みます。

変更点

  • src/sort_by.php<=> で比較。ASSOC はキー保持、LIST は連番へ再付番
  • tests/SortByTest.php — 10 ケース
  • composer.jsonautoload.files に 1 件追加

動作確認

  • 手動:sort_by(['carol' => 3, 'alice' => 1, 'bob' => 2], fn ($v, $k) => $k)['alice' => 1, 'bob' => 2, 'carol' => 3]
  • 自動:
    • vendor/bin/php-cs-fixer fix --dry-run --diff / vendor/bin/phpstan analyse -c phpstan.neon / vendor/bin/phpunit tests
    • 結果:OK (107 tests, 112 assertions) / PHPStan level 10 [OK] No errors / CS Fixer Fixed 0 of 31 files

補足(任意)

  • 安定ソートです。PHP 8.0 以降の usort / uasort が安定なので、比較キーが同値の要素は入力順を維持します (phpdoc に明記、テストで担保)。issue feat: sort_by を追加する #72 の「安定性は仕様明記」要件への対応です
  • usort は参照渡しなので、{key, value, sort_key} のエントリ配列を組み立ててからソートし、入力を破壊しません (テストで担保)
  • selector は要素数と同じ回数だけ呼ばれます (比較キーを事前計算する実装)
  • @phpstan-param の条件型は付けていません。付けると「assoc 入力 + MODE_LIST」が型エラーになるためで、src/slice.php / src/map.php / src/intersect.php と同じ形です

Closes #72

🤖 Generated with Claude Code

selector が返す比較キーの昇順で配列をソートする関数を追加する。
usort/uasort の安定ソート仕様をそのまま利用し、比較キーが同値の
要素は入力順を維持する(phpdoc に明記)。MODE_ASSOC はキー保持、
MODE_LIST は 0 始まりで再付番する。selector の呼び出しは要素ごと
に 1 回、事前計算したキャッシュで比較する実装を選択した。

Closes #72
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: sort_by を追加する

1 participant