diff --git a/Makefile b/Makefile index b78ec91..3eb5475 100644 --- a/Makefile +++ b/Makefile @@ -23,6 +23,9 @@ style-check: style-fix: $(docker) vendor/bin/phpcbf -p --standard=PSR12 src +stan: + $(docker) vendor/bin/phpstan analyse + unit: $(docker) -dzend_extension=xdebug.so -dxdebug.mode=coverage vendor/bin/phpunit diff --git a/src/MappedWithKeys.php b/src/MappedWithKeys.php new file mode 100644 index 0000000..41f884c --- /dev/null +++ b/src/MappedWithKeys.php @@ -0,0 +1,92 @@ + $arrayee + * @param callable $valFunc + * @return self + */ + public static function preserveKeys(Arrayee $arrayee, callable $valFunc): self + { + return new self( + $arrayee, + static function ($key) { + return $key; + }, + $valFunc + ); + } + + /** + * @param Arrayee $arrayee + * @param callable $keyFunc + * @return self + */ + public static function preserveValues(Arrayee $arrayee, callable $keyFunc): self + { + return new self( + $arrayee, + $keyFunc, + static function ($key, $val) { + return $val; + }, + ); + } + + /** + * MappedWithKeys constructor. + * @param Arrayee $arrayee + * @param callable $keyFunc + * @param callable $valFunc + */ + public function __construct(Arrayee $arrayee, callable $keyFunc, callable $valFunc) + { + $this->arrayee = $arrayee; + $this->keyFunc = $keyFunc; + $this->valFunc = $valFunc; + } + + /** + * @return array + * @throws Exception + */ + public function asArray(): array + { + $res = []; + foreach ($this->arrayee->asArray() as $key => $val) { + $res[ + call_user_func($this->keyFunc, $key, $val) + ] = call_user_func($this->valFunc, $key, $val); + } + + return $res; + } +} diff --git a/tests/MappedWithKeysTest.php b/tests/MappedWithKeysTest.php new file mode 100644 index 0000000..bb622c3 --- /dev/null +++ b/tests/MappedWithKeysTest.php @@ -0,0 +1,89 @@ + 'FOO', + 6 => 'BAR', + 10 => 'BAZ', + ], + (new MappedWithKeys( + new Just([ + 1 => 'foo', + 3 => 'bar', + 5 => 'baz', + ]), + static function(int $key): int { + return $key * 2; + }, + static function(int $key, string $val): string { + return strtoupper($val); + }, + ))->asArray() + ); + } + + /** + * @throws Exception + */ + public function testPreserveKeys(): void + { + self::assertEquals( + [ + 1 => 'FOO', + 3 => 'BAR', + 5 => 'BAZ', + ], + MappedWithKeys::preserveKeys( + new Just([ + 1 => 'foo', + 3 => 'bar', + 5 => 'baz', + ]), + static function(int $key, string $val): string { + return strtoupper($val); + }, + )->asArray() + ); + } + + /** + * @throws Exception + */ + public function testPreserveValues(): void + { + self::assertEquals( + [ + 2 => 'foo', + 6 => 'bar', + 10 => 'baz', + ], + MappedWithKeys::preserveValues( + new Just([ + 1 => 'foo', + 3 => 'bar', + 5 => 'baz', + ]), + static function(int $key): int { + return $key * 2; + }, + )->asArray() + ); + } +}