77use Countable ;
88use Iterator ;
99use IteratorAggregate ;
10+ use function array_filter ;
1011use function array_map ;
1112use function array_splice ;
1213use function array_values ;
@@ -47,18 +48,32 @@ public static function fromMembers(iterable $members = [], iterable $parameters
4748 return new self (Parameters::fromAssociative ($ parameters ), ...$ newMembers );
4849 }
4950
50- public function toHttpValue ( ): string
51+ private static function filterMember ( Item | ByteSequence | Token | bool | int | float | string $ member ): Item
5152 {
52- $ returnArray = array_map (fn (Item $ value ): string => $ value ->toHttpValue (), $ this ->members );
53+ return match (true ) {
54+ $ member instanceof Item => $ member ,
55+ default => Item::from ($ member ),
56+ };
57+ }
5358
54- return '( ' .implode (' ' , $ returnArray ).') ' .$ this ->parameters ->toHttpValue ();
59+ public function toHttpValue (): string
60+ {
61+ return '( '
62+ .implode (' ' , array_map (fn (Item $ value ): string => $ value ->toHttpValue (), $ this ->members ))
63+ .') '
64+ .$ this ->parameters ->toHttpValue ();
5565 }
5666
5767 public function parameters (): Parameters
5868 {
5969 return $ this ->parameters ;
6070 }
6171
72+ public function parameter (string $ key ): Item |Token |ByteSequence |float |int |bool |string
73+ {
74+ return $ this ->parameters ->get ($ key )->value ();
75+ }
76+
6277 public function count (): int
6378 {
6479 return count ($ this ->members );
@@ -113,14 +128,6 @@ public function unshift(Item|ByteSequence|Token|bool|int|float|string ...$member
113128 $ this ->members = [...array_map (self ::filterMember (...), $ members ), ...$ this ->members ];
114129 }
115130
116- private static function filterMember (Item |ByteSequence |Token |bool |int |float |string $ member ): Item
117- {
118- return match (true ) {
119- $ member instanceof Item => $ member ,
120- default => Item::from ($ member ),
121- };
122- }
123-
124131 /**
125132 * Insert members at the end of the list.
126133 */
@@ -147,25 +154,30 @@ public function insert(int $index, Item|ByteSequence|Token|bool|int|float|string
147154
148155 public function replace (int $ index , Item |ByteSequence |Token |bool |int |float |string $ member ): void
149156 {
150- if (! $ this ->has ($ index )) {
157+ if (null === ( $ offset = $ this ->filterIndex ($ index) )) {
151158 throw InvalidOffset::dueToIndexNotFound ($ index );
152159 }
153160
154- $ this ->members [$ this -> filterIndex ( $ index ) ] = self ::filterMember ($ member );
161+ $ this ->members [$ offset ] = self ::filterMember ($ member );
155162 }
156163
157164 /**
158165 * Delete members associated with the list of instance indexes.
159166 */
160167 public function remove (int ...$ indexes ): void
161168 {
162- foreach (array_map (fn (int $ index ): int |null => $ this ->filterIndex ($ index ), $ indexes ) as $ index ) {
163- if (null !== $ index ) {
164- unset($ this ->members [$ index ]);
165- }
169+ $ offsets = array_filter (
170+ array_map (fn (int $ index ): int |null => $ this ->filterIndex ($ index ), $ indexes ),
171+ fn (int |null $ index ): bool => null !== $ index
172+ );
173+
174+ foreach ($ offsets as $ offset ) {
175+ unset($ this ->members [$ offset ]);
166176 }
167177
168- $ this ->members = array_values ($ this ->members );
178+ if ([] !== $ offsets ) {
179+ $ this ->members = array_values ($ this ->members );
180+ }
169181 }
170182
171183 /**
0 commit comments