Skip to content

feat: take_while と drop_while を追加する - #85

Open
Javakky wants to merge 2 commits into
masterfrom
javakky/take-drop-while
Open

feat: take_while と drop_while を追加する#85
Javakky wants to merge 2 commits into
masterfrom
javakky/take-drop-while

Conversation

@Javakky

@Javakky Javakky commented Jul 27, 2026

Copy link
Copy Markdown
Collaborator

概要(What / Why)

先頭から条件が続く間だけ取る take_while と、その境界までを捨てる drop_while を追加します。
filter と違い「境界で打ち切る」ので、ソート済み配列の切り出しなどが 1 呼び出しで書けます。

変更点

  • src/take_while.php — 初回 false で境界確定。以降は callback を呼ばない
  • src/drop_while.php — 境界より後ろは callback が再び true になっても残す
  • tests/TakeWhileTest.php / tests/DropWhileTest.php
  • composer.jsonautoload.files に 2 件追加

動作確認

  • 手動:drop_while([1, 2, 5, 1, 2], fn ($v) => $v < 3)[5, 1, 2] (filter なら [1, 2, 1, 2])
  • 自動:
    • vendor/bin/php-cs-fixer fix --dry-run --diff / vendor/bin/phpstan analyse -c phpstan.neon / vendor/bin/phpunit tests
    • 結果:OK (118 tests, 129 assertions) / PHPStan level 10 [OK] No errors / CS Fixer Fixed 0 of 33 files

補足(任意)

  • filter との違い (境界より後ろは条件を満たさなくても残す) を phpdoc に明記し、[1, 2, 5, 1, 2] で両者の結果が異なることをテストで固定しています
  • 境界確定後に callback が呼ばれないことは、呼び出し回数を数えるクロージャで assert しています。同じテストで戻り値も見ているので「呼ばれない」と「残る」が 1 ケースで結びついています
  • 引数名は既存の filter / any に揃えて $callback にしました
  • @phpstan-param の条件型は付けていません (「assoc 入力 + MODE_LIST」が型エラーになるため。slice.php / map.php / intersect.php と同じ形)
  • テスト 2 箇所の /** @var list<int> $input */ は、「全件が条件成立」テストでリテラル配列に対する比較が smaller.alwaysTrue と判定されるのを避けるためです (外すと level 10 が落ちることを確認済み)

Closes #66
Closes #67

🤖 Generated with Claude Code

Javakky added 2 commits July 27, 2026 16:14
先頭から述語が真である間の要素を取り出す関数を追加。初回の false で
評価を打ち切り、以降の要素には述語を呼ばない。MODE_ASSOC はキー保持、
MODE_LIST は連番へ再付番する。

Closes #66
先頭から述語が真である間の要素を捨て、初回の false 以降をすべて返す
関数を追加。境界確定後は要素の値によらずすべて残す点が filter() と
異なる。境界確定後は述語を呼ばない。MODE_ASSOC はキー保持、MODE_LIST
は連番へ再付番する。

Closes #67
@Javakky
Javakky force-pushed the javakky/take-drop-while branch from 9723764 to 335f15e Compare July 27, 2026 07:16
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: drop_while を追加する feat: take_while を追加する

1 participant