Skip to content

feat: find_option を追加する - #82

Open
Javakky wants to merge 1 commit into
masterfrom
javakky/find-option
Open

feat: find_option を追加する#82
Javakky wants to merge 1 commit into
masterfrom
javakky/find-option

Conversation

@Javakky

@Javakky Javakky commented Jul 27, 2026

Copy link
Copy Markdown
Collaborator

概要(What / Why)

条件に一致する最初の要素のを返す find_option を追加します。head_option / last_option と同じ「見つからなければ null」の系列です。

Important

issue #60array{0: key, 1: value} のタプルを返す仕様でしたが、値だけを返す形に変更しました。理由は下記「補足」を参照してください。反対でしたら戻します。

変更点

  • src/find_option.php — 先頭一致で即 return。未検出と空配列は null
  • tests/FindOptionTest.php — 8 観点
  • composer.jsonautoload.files に 1 件追加

動作確認

  • 手動:find_option(['a' => 1, 'b' => 2], fn ($v) => $v === 2)2
  • 自動:
    • vendor/bin/php-cs-fixer fix --dry-run --diff / vendor/bin/phpstan analyse -c phpstan.neon / vendor/bin/phpunit tests
    • 結果:OK (114 tests, 123 assertions) / PHPStan level 10 [OK] No errors / CS Fixer Found 0 of 33 files

補足(任意)

issue の仕様 (タプルを返す) を撤回しました

標準ライブラリはどれも値だけを返します。

言語 相当する関数 戻り値
Scala 2.13 IterableOps.find(p: (A) => Boolean) Option[A] — 値だけ
Kotlin Iterable<T>.firstOrNull(predicate) T? — 値だけ

加えてこのリポジトリ内でも非対称でした。head_option / last_option は値だけを返しているので、find_option だけがタプルを返す設計になっていました。

Mode 引数も削除しました。キーを返さないので mode で変わるものがありません (当初の実装では MODE_LIST で第 1 要素を反復順の index にしていました)。

「null 値と未検出を区別できない」制約について

値だけを返すので、一致した要素が null の場合と未検出を区別できません。これは head_option / last_option が既に持っている制約と同じで、phpdoc に同じ書式で明記し、テストでも「区別できないこと」を固定しています。

// head_option の既存の注意書き
注意: 最初の要素が null の場合と空配列の場合を区別できません。

// find_option に入れた注意書き
注意: 一致した要素が null の場合と、一致する要素がない場合を区別できません。

キーが必要なケース

将来 find_entry のような別関数に切り出せます。今は作りません — 必要になってから追加する方が、使われない API を増やさずに済みます。Kotlin でも「Map のエントリを探す」は entries.firstOrNull { … } とエントリのコレクションを経由する形になっています。

副次的な効果

#76 (カリー化) で戻り値の「器」ごとにクラスを分ける設計を検討していますが、タプルを返す find_option は 1 関数専用の器が必要でした。値だけ返す形にすると any / all / none / reduce と同じ「配列でない戻り」の器で賄えるので、クラスが 1 つ減ります。

その他

  • 短絡評価 (先頭一致で即 return、以降 callback を呼ばない) は呼び出し回数を数えるクロージャで固定しています
  • 空配列では callback が一度も呼ばれないことも assert しています
  • $callback の第 2 引数に元のキーが渡ること (list なら int、assoc なら string) をテストしています

Closes #60

🤖 Generated with Claude Code

@Javakky
Javakky force-pushed the javakky/find-option branch 2 times, most recently from 9bb2423 to 940b6d8 Compare July 27, 2026 07:31
条件に一致する最初の要素の値を返す関数を追加する。先頭一致を短絡評価で
探索し、未検出・空配列は null を返す。

Scala の find (値だけを返す Option) や Kotlin の firstOrNull はいずれも
値だけを返し、このリポジトリ内の head_option / last_option も値だけを
返すため、[キー, 値] のタプルと Mode 引数を持つ設計を撤回する。Mode は
戻り値のキーの扱いを切り替えるものだが、値だけを返す関数にはキーの扱い
自体が存在せず、Mode を持たせる余地がない。キーが必要な場合は将来別関数
(find_entry 等) に切り出す。

Closes #60
@Javakky
Javakky force-pushed the javakky/find-option branch from 940b6d8 to c7be6be Compare July 27, 2026 11:15
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: find_option を追加する

1 participant