Skip to content

Commit 5d05f5f

Browse files
committed
Introduce mergeAssociative and mergePairs
1 parent d382fb6 commit 5d05f5f

File tree

7 files changed

+141
-22
lines changed

7 files changed

+141
-22
lines changed

CHANGELOG.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@ All Notable changes to `bakame/http-strucured-fields` will be documented in this
66

77
### Added
88

9-
- All containers `Dictionary`, `InnerList`, `OrderedList`, `Parameters` modifying methods are made chainable.
9+
- `Dictionary::mergeAssociative` and `Dictionary::mergePairs` to allow merging with associative structures
10+
- `Parameters::mergeAssociative` and `Parameters::mergePairs` to allow merging with key-value pairs structures
1011

1112
### Fixed
1213

13-
- Made the `Parser` only returning collections array of items or bare items value
14+
- All containers `Dictionary`, `InnerList`, `OrderedList`, `Parameters` modifying methods are made chainable.
15+
- `Parser` only returns `array`'s of items or bare items value.
1416
- All `Parameters` getters checks for bare items validity.
1517
- `ForbiddenStateError` extends SPL `LogicException` instead of `UnexpectedValueException`
1618

@@ -20,7 +22,8 @@ All Notable changes to `bakame/http-strucured-fields` will be documented in this
2022

2123
### Removed
2224

23-
- None
25+
- **[BC Break]** `Dictionary::merge` replaced by `Dictionary::mergeAssociative`
26+
- **[BC Break]** `Parameters::merge` replaced by `Parameters::mergeAssociative`
2427

2528
## [0.3.0] - 2022-03-21
2629

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ $parameters->value('b'); // returns true
233233
$parameters->get('b'); // returns Item::from(true)
234234
iterator_to_array($parameters->toPairs(), true); // returns [['b', Item::from(true)], ['foo', Item::from('bar')]]
235235
iterator_to_array($parameters, true); // returns ['b' => Item::from(true), 'foo' => Item::from('bar')]
236-
$parameters->merge(
236+
$parameters->mergeAssociative(
237237
Parameters::fromAssociative(['b' => true, 'foo' => 'foo']),
238238
['b' => 'false']
239239
);

src/Dictionary.php

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,15 @@ public static function fromAssociative(iterable $members = []): self
5959
* the first member represents the instance entry key
6060
* the second member represents the instance entry value
6161
*
62-
* @param iterable<array{0:string, 1:InnerList|Item|ByteSequence|Token|bool|int|float|string}> $pairs
62+
* @param Dictionary|iterable<array{0:string, 1:InnerList|Item|ByteSequence|Token|bool|int|float|string}> $pairs
6363
*/
64-
public static function fromPairs(iterable $pairs = []): self
64+
public static function fromPairs(Dictionary|iterable $pairs = []): self
6565
{
6666
$instance = new self();
67+
if ($pairs instanceof Dictionary) {
68+
$pairs = $pairs->toPairs();
69+
}
70+
6771
foreach ($pairs as [$key, $member]) {
6872
$instance->set($key, $member);
6973
}
@@ -292,14 +296,28 @@ public function prepend(string $key, InnerList|Item|ByteSequence|Token|bool|int|
292296
/**
293297
* Merge multiple instances.
294298
*
295-
* @param iterable<array-key, InnerList|Item|ByteSequence|Token|bool|int|float|string> ...$others
299+
* @param Dictionary|iterable<string, InnerList|Item|ByteSequence|Token|bool|int|float|string> ...$others
296300
*/
297-
public function merge(iterable ...$others): self
301+
public function mergeAssociative(Dictionary|iterable ...$others): self
298302
{
299303
foreach ($others as $other) {
300304
$this->members = [...$this->members, ...self::fromAssociative($other)->members];
301305
}
302306

303307
return $this;
304308
}
309+
310+
/**
311+
* Merge multiple instances using iterable pairs.
312+
*
313+
* @param Dictionary|iterable<array{0:string, 1:InnerList|Item|ByteSequence|Token|bool|int|float|string}> ...$others
314+
*/
315+
public function mergePairs(Dictionary|iterable ...$others): self
316+
{
317+
foreach ($others as $other) {
318+
$this->members = [...$this->members, ...self::fromPairs($other)->members];
319+
}
320+
321+
return $this;
322+
}
305323
}

src/DictionaryTest.php

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -150,13 +150,13 @@ public function it_can_returns_the_container_member_keys(): void
150150
/**
151151
* @test
152152
*/
153-
public function it_can_merge_one_or_more_instances(): void
153+
public function it_can_merge_one_or_more_instances_using_associative(): void
154154
{
155155
$instance1 = Dictionary::fromAssociative(['a' => Item::from(false)]);
156156
$instance2 = Dictionary::fromAssociative(['b' => Item::from(true)]);
157157
$instance3 = Dictionary::fromAssociative(['a' => Item::from(42)]);
158158

159-
$instance1->merge($instance2, $instance3);
159+
$instance1->mergeAssociative($instance2, $instance3);
160160
self::assertCount(2, $instance1);
161161

162162
self::assertEquals(Item::from(42), $instance1->get('a'));
@@ -172,7 +172,7 @@ public function it_can_merge_two_or_more_instances_to_yield_different_result():
172172
$instance2 = Dictionary::fromAssociative(['b' => Item::from(true)]);
173173
$instance3 = Dictionary::fromAssociative(['a' => Item::from(42)]);
174174

175-
$instance3->merge($instance2, $instance1);
175+
$instance3->mergeAssociative($instance2, $instance1);
176176
self::assertCount(2, $instance3);
177177

178178
self::assertEquals(Item::from(false), $instance3->get('a'));
@@ -185,10 +185,50 @@ public function it_can_merge_two_or_more_instances_to_yield_different_result():
185185
public function it_can_merge_without_argument_and_not_throw(): void
186186
{
187187
$instance = Dictionary::fromAssociative(['a' => Item::from(false)]);
188-
$instance->merge();
188+
$instance->mergeAssociative();
189189
self::assertCount(1, $instance);
190190
}
191191

192+
/**
193+
* @test
194+
*/
195+
public function it_can_merge_one_or_more_instances_using_pairs(): void
196+
{
197+
$instance1 = Dictionary::fromPairs([['a', Item::from(false)]]);
198+
$instance2 = Dictionary::fromPairs([['b', Item::from(true)]]);
199+
$instance3 = Dictionary::fromPairs([['a', Item::from(42)]]);
200+
201+
$instance3->mergePairs($instance2, $instance1);
202+
self::assertCount(2, $instance3);
203+
204+
self::assertEquals(Item::from(false), $instance3->get('a'));
205+
self::assertEquals(Item::from(true), $instance3->get('b'));
206+
}
207+
208+
/**
209+
* @test
210+
*/
211+
public function it_can_merge_without_pairs_and_not_throw(): void
212+
{
213+
$instance = Dictionary::fromAssociative(['a' => Item::from(false)]);
214+
215+
self::assertCount(1, $instance->mergePairs());
216+
}
217+
218+
/**
219+
* @test
220+
*/
221+
public function it_can_merge_dictionary_instances_via_pairs_or_associative(): void
222+
{
223+
$instance1 = Dictionary::fromAssociative(['a' => Item::from(false)]);
224+
$instance2 = Dictionary::fromAssociative(['b' => Item::from(true)]);
225+
226+
$instance3 = clone $instance1;
227+
$instance4 = clone $instance2;
228+
229+
self::assertEquals($instance3->mergeAssociative($instance4), $instance1->mergePairs($instance2));
230+
}
231+
192232
/**
193233
* @test
194234
*/

src/ItemTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ public function it_can_exchange_parameters(): void
251251
self::assertCount(0, $instance->parameters);
252252

253253
$instance->parameters->clear();
254-
$instance->parameters->merge(['foo' => 'bar']);
254+
$instance->parameters->mergeAssociative(['foo' => 'bar']);
255255

256256
self::assertCount(1, $instance->parameters);
257257
self::assertSame('bar', $instance->parameters->value('foo'));

src/Parameters.php

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -95,13 +95,17 @@ public static function fromAssociative(iterable $members = []): self
9595
* the first member represents the instance entry key
9696
* the second member represents the instance entry value
9797
*
98-
* @param iterable<array{0:string, 1:Item|ByteSequence|Token|bool|int|float|string}> $pairs
98+
* @param Parameters|iterable<array{0:string, 1:Item|ByteSequence|Token|bool|int|float|string}> $pairs
9999
*
100100
* @throws ForbiddenStateError If the bare item contains parameters
101101
*/
102-
public static function fromPairs(iterable $pairs = []): self
102+
public static function fromPairs(Parameters|iterable $pairs = []): self
103103
{
104104
$instance = new self();
105+
if ($pairs instanceof Parameters) {
106+
$pairs = $pairs->toPairs();
107+
}
108+
105109
foreach ($pairs as [$key, $member]) {
106110
$instance->set($key, $member);
107111
}
@@ -374,17 +378,31 @@ public function prepend(string $key, Item|ByteSequence|Token|bool|int|float|stri
374378
}
375379

376380
/**
377-
* Merge multiple instances.
381+
* Merge multiple instances using associative pairs.
378382
*
379-
* @param iterable<array-key, Item|Token|ByteSequence|float|int|bool|string> ...$others
380-
* @throws ForbiddenStateError if the found item is in invalid state
383+
* @param Parameters|iterable<array-key, Item|Token|ByteSequence|float|int|bool|string> ...$others
384+
* @throws ForbiddenStateError if the found item is in invalid state
381385
*/
382-
public function merge(iterable ...$others): self
386+
public function mergeAssociative(Parameters|iterable ...$others): self
383387
{
384388
foreach ($others as $other) {
385389
$this->members = [...$this->members, ...self::fromAssociative($other)->members];
386390
}
387391

388392
return $this;
389393
}
394+
395+
/**
396+
* Merge multiple instances using iterable pairs.
397+
*
398+
* @param Parameters|iterable<array{0:string, 1:Item|ByteSequence|Token|bool|int|float|string}> ...$others
399+
*/
400+
public function mergePairs(Parameters|iterable ...$others): self
401+
{
402+
foreach ($others as $other) {
403+
$this->members = [...$this->members, ...self::fromPairs($other)->members];
404+
}
405+
406+
return $this;
407+
}
390408
}

src/ParametersTest.php

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ public function it_can_merge_one_or_more_instances(): void
177177
$instance2 = Parameters::fromAssociative(['b' => true]);
178178
$instance3 = Parameters::fromAssociative(['a' => 42]);
179179

180-
$instance1->merge($instance2, $instance3);
180+
$instance1->mergeAssociative($instance2, $instance3);
181181

182182
self::assertEquals(Item::from(42), $instance1->get('a'));
183183
self::assertEquals(Item::from(true), $instance1->get('b'));
@@ -192,7 +192,7 @@ public function it_can_merge_two_or_more_dictionaries_different_result(): void
192192
$instance2 = Parameters::fromAssociative(['b' => Item::from(true)]);
193193
$instance3 = Parameters::fromAssociative(['a' => Item::from(42)]);
194194

195-
$instance3->merge($instance2, $instance1);
195+
$instance3->mergeAssociative($instance2, $instance1);
196196

197197
self::assertEquals(Item::from(false), $instance3->get('a'));
198198
self::assertEquals(Item::from(true), $instance3->get('b'));
@@ -204,10 +204,50 @@ public function it_can_merge_two_or_more_dictionaries_different_result(): void
204204
public function it_can_merge_without_argument_and_not_throw(): void
205205
{
206206
$instance = Parameters::fromAssociative(['a' => Item::from(false)]);
207-
$instance->merge();
207+
$instance->mergeAssociative();
208208
self::assertCount(1, $instance);
209209
}
210210

211+
/**
212+
* @test
213+
*/
214+
public function it_can_merge_one_or_more_instances_using_pairs(): void
215+
{
216+
$instance1 = Parameters::fromPairs([['a', Item::from(false)]]);
217+
$instance2 = Parameters::fromPairs([['b', Item::from(true)]]);
218+
$instance3 = Parameters::fromPairs([['a', Item::from(42)]]);
219+
220+
$instance3->mergePairs($instance2, $instance1);
221+
self::assertCount(2, $instance3);
222+
223+
self::assertEquals(Item::from(false), $instance3->get('a'));
224+
self::assertEquals(Item::from(true), $instance3->get('b'));
225+
}
226+
227+
/**
228+
* @test
229+
*/
230+
public function it_can_merge_without_pairs_and_not_throw(): void
231+
{
232+
$instance = Parameters::fromAssociative(['a' => Item::from(false)]);
233+
234+
self::assertCount(1, $instance->mergePairs());
235+
}
236+
237+
/**
238+
* @test
239+
*/
240+
public function it_can_merge_dictionary_instances_via_pairs_or_associative(): void
241+
{
242+
$instance1 = Parameters::fromAssociative(['a' => Item::from(false)]);
243+
$instance2 = Parameters::fromAssociative(['b' => Item::from(true)]);
244+
245+
$instance3 = clone $instance1;
246+
$instance4 = clone $instance2;
247+
248+
self::assertEquals($instance3->mergeAssociative($instance4), $instance1->mergePairs($instance2));
249+
}
250+
211251
/**
212252
* @test
213253
*/

0 commit comments

Comments
 (0)