Skip to content

feat: take と drop を追加する - #84

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

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

Conversation

@Javakky

@Javakky Javakky commented Jul 27, 2026

Copy link
Copy Markdown
Collaborator

概要(What / Why)

先頭 n 件を取り出す take と、先頭 n 件を捨てる drop を追加します。
親 issue #56 の breakdown で挙がっていた基本操作で、slice のオフセット計算を毎回書かずに済みます。

変更点

  • src/take.php — 先頭から最大 n 件。n <= 0 は空、n >= count は全件
  • src/drop.php — 先頭 n 件を除外。n <= 0 は全件、n >= count は空
  • tests/TakeTest.php / tests/DropTest.php
  • composer.jsonautoload.files に 2 件追加

動作確認

  • 手動:
    • take(['a' => 1, 'b' => 2, 'c' => 3], 2, Mode::MODE_LIST)[1, 2]
    • drop([1, 2, 3], 1, Mode::MODE_ASSOC)[1 => 2, 2 => 3]
  • 自動:
    • vendor/bin/php-cs-fixer fix --dry-run --diff / vendor/bin/phpstan analyse -c phpstan.neon / vendor/bin/phpunit tests
    • 結果:OK (117 tests, 122 assertions) / PHPStan level 10 [OK] No errors / CS Fixer Fixed 0 of 33 files

補足(任意)

array_slice$preserve_keys に丸投げしていません

array_slice()$preserve_keys = false でも文字列キーを保持します (再付番されるのは数値キーだけ)。そのため array_slice(..., true) で取り出してから MODE_LIST のときだけ array_values() する実装にしています。

既存の src/slice.php はこの対処がなく、slice(['a' => 1, 'b' => 2], 0, 2, Mode::MODE_LIST)['a' => 1, 'b' => 2] を返して宣言している list<V> に反します (tests/SliceTest.php に assoc 入力 + MODE_LIST のケースが無いため露見していません)。既存関数の変更はこの PR のスコープ外なので触っていませんが、別 issue に切り出す価値があります。

その他

  • @phpstan-param の条件型は付けていません。付けると「assoc 入力 + MODE_LIST」が型エラーになるためで、src/slice.php / src/map.php / src/intersect.php と同じ形です
  • list 入力 + MODE_ASSOC で整数キーが 0 始まりに詰め直されないこともテストで固定しています

Closes #64
Closes #65

🤖 Generated with Claude Code

Javakky added 2 commits July 27, 2026 16:14
配列の先頭から最大 n 件を取り出す take 関数を追加する。
n <= 0 は空配列、n が件数以上なら全件を返す。
Mode::MODE_LIST 指定時は 0 始まりへ再付番する。

Closes #64
配列の先頭から n 件を除外する drop 関数を追加する。
n <= 0 は全件、n が件数以上なら空配列を返す。
Mode::MODE_LIST 指定時は残った要素を 0 始まりへ再付番する。

Closes #65
@Javakky
Javakky force-pushed the javakky/take-drop branch from c8c2297 to c126e94 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 を追加する feat: take を追加する

1 participant