Add mapToArray to doc list
This commit is contained in:
parent
3d2bc2a904
commit
407441e857
|
@ -103,6 +103,24 @@ class DocumentList
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Iterate the generator, extracting key/value pairs returned as an associative array
|
||||||
|
*
|
||||||
|
* @template TValue The type for the mapped value
|
||||||
|
* @param callable(TDoc): (int|string) $keyFunc The function to extract a key from the document
|
||||||
|
* @param callable(TDoc): TValue $valueFunc The function to extract a value from the document
|
||||||
|
* @return TValue[] An associative array of values, keyed by the extracted keys
|
||||||
|
* @throws DocumentException If this is called once the generator has been consumed
|
||||||
|
*/
|
||||||
|
public function mapToArray(callable $keyFunc, callable $valueFunc): array
|
||||||
|
{
|
||||||
|
$results = [];
|
||||||
|
foreach ($this->items() as $item) {
|
||||||
|
$results[$keyFunc($item)] = $valueFunc($item);
|
||||||
|
}
|
||||||
|
return $results;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ensure the statement is destroyed if the generator is not exhausted
|
* Ensure the statement is destroyed if the generator is not exhausted
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -113,4 +113,15 @@ class DocumentListTest extends TestCase
|
||||||
$this->assertEquals('*** *** ***** **** ****', implode(' ', $splats),
|
$this->assertEquals('*** *** ***** **** ****', implode(' ', $splats),
|
||||||
'Iteration did not have the expected result');
|
'Iteration did not have the expected result');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testMapToArraySucceeds(): void
|
||||||
|
{
|
||||||
|
$list = DocumentList::create(Query::selectFromTable(ThrowawayDb::TABLE), [],
|
||||||
|
new DocumentMapper(TestDocument::class));
|
||||||
|
$this->assertNotNull($list, 'There should have been a document list created');
|
||||||
|
$this->assertTrue($list->hasItems(), 'There should be items in the list');
|
||||||
|
$lookup = $list->mapToArray(fn($it) => $it->id, fn($it) => $it->value);
|
||||||
|
$expected = ['one' => 'FIRST!', 'two' => 'another', 'three' => '', 'four' => 'purple', 'five' => 'purple'];
|
||||||
|
$this->assertEquals($expected, $lookup, 'The array was not mapped correctly');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -111,4 +111,15 @@ class DocumentListTest extends TestCase
|
||||||
$this->assertEquals('*** *** ***** **** ****', implode(' ', $splats),
|
$this->assertEquals('*** *** ***** **** ****', implode(' ', $splats),
|
||||||
'Iteration did not have the expected result');
|
'Iteration did not have the expected result');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testMapToArraySucceeds(): void
|
||||||
|
{
|
||||||
|
$list = DocumentList::create(Query::selectFromTable(ThrowawayDb::TABLE), [],
|
||||||
|
new DocumentMapper(TestDocument::class));
|
||||||
|
$this->assertNotNull($list, 'There should have been a document list created');
|
||||||
|
$this->assertTrue($list->hasItems(), 'There should be items in the list');
|
||||||
|
$lookup = $list->mapToArray(fn($it) => $it->id, fn($it) => $it->value);
|
||||||
|
$expected = ['one' => 'FIRST!', 'two' => 'another', 'three' => '', 'four' => 'purple', 'five' => 'purple'];
|
||||||
|
$this->assertEquals($expected, $lookup, 'The array was not mapped correctly');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user