diff --git a/generators/Tuple/FragmentGenerator/AppendPrependMethodAbstractGenerator.php b/generators/Tuple/FragmentGenerator/AppendPrependMethodAbstractGenerator.php index cdac143..62ee7e0 100644 --- a/generators/Tuple/FragmentGenerator/AppendPrependMethodAbstractGenerator.php +++ b/generators/Tuple/FragmentGenerator/AppendPrependMethodAbstractGenerator.php @@ -17,19 +17,20 @@ public function append(PhpNamespace $namespace, ClassType $class, int $tupleSize $method = $class->addMethod($this->methodName()); $method->addParameter('value'); + $method->addComment('@template T'); + $method->addComment(self::EMPTY_COMMENT_LINE); + $method->addComment('@param T $value'); + $method->addComment(self::EMPTY_COMMENT_LINE); if ($this->isMaxSizeTuple($tupleSize, $maxTupleSize)) { $namespace->addUse(UnsupportedOperationException::class); $method->setBody($this->getMaxTupleSizeExceptionThrowBody()); + $method->setReturnType('never'); return; } $method->setReturnType($this->getMethodReturnType($namespace, $resultTupleSize)); - $method->addComment('@template T'); - $method->addComment(self::EMPTY_COMMENT_LINE); - $method->addComment('@param T $value'); - $method->addComment(self::EMPTY_COMMENT_LINE); $method->addComment($this->getReturnTypeComment($resultTupleSize, $tupleSize)); $method->setBody($this->getMethodBody($resultTupleSize, $tupleSize)); } @@ -49,7 +50,7 @@ private function getMethodReturnType(PhpNamespace $namespace, int $resultTupleSi private function getReturnTypeComment(int $resultTupleSize, int $tupleSize): string { - return sprintf('@returns Tuple%s<%s>', $resultTupleSize, $this->listOfTypes($tupleSize)); + return sprintf('@return Tuple%s<%s>', $resultTupleSize, $this->listOfTypes($tupleSize)); } private function getMethodBody(int $resultTupleSize, int $tupleSize): string diff --git a/generators/Tuple/FragmentGenerator/ConcatMethodGenerator.php b/generators/Tuple/FragmentGenerator/ConcatMethodGenerator.php index 5e3fb06..415c182 100644 --- a/generators/Tuple/FragmentGenerator/ConcatMethodGenerator.php +++ b/generators/Tuple/FragmentGenerator/ConcatMethodGenerator.php @@ -47,7 +47,12 @@ private function generateConcatTupleNMethod(int $n, int $tupleSize, ClassType $c $concatTupleN->addComment(sprintf('@param Tuple%s%s $tuple', $n, $paramTupleGenerics)); $concatTupleN->addComment(self::EMPTY_COMMENT_LINE); - $concatTupleN->addComment(sprintf('@returns Tuple%s%s', $returnTupleSize, $returnTupleGenerics)); - $concatTupleN->addBody('return $this->concat($tuple);'); + $concatTupleN->addComment(sprintf('@return Tuple%s%s', $returnTupleSize, $returnTupleGenerics)); + + if ($this->isTupleZero($tupleSize) && $n === 0) { + $concatTupleN->addBody('return new Tuple0();'); + } else { + $concatTupleN->addBody('return $this->concat($tuple);'); + } } } diff --git a/generators/Tuple/FragmentGenerator/ToArrayMethodGenerator.php b/generators/Tuple/FragmentGenerator/ToArrayMethodGenerator.php index 2d39d21..1e7fa9e 100644 --- a/generators/Tuple/FragmentGenerator/ToArrayMethodGenerator.php +++ b/generators/Tuple/FragmentGenerator/ToArrayMethodGenerator.php @@ -13,6 +13,11 @@ class ToArrayMethodGenerator extends FragmentGenerator public function append(PhpNamespace $namespace, ClassType $class, int $tupleSize, int $maxTupleSize): void { $toArray = $class->addMethod('toArray'); + if ($this->isTupleZero($tupleSize)) { + $toArray->addComment('@return array{}'); + } else { + $toArray->addComment('@return array{'.join(', ', array_map(fn ($int) => 'T'.$int, range(1, $tupleSize))).'}'); + } $toArray->setReturnType('array'); if ($this->isTupleZero($tupleSize)) { diff --git a/src/Collection/Stream/Collectors.php b/src/Collection/Stream/Collectors.php index 79dcb20..5ed4425 100644 --- a/src/Collection/Stream/Collectors.php +++ b/src/Collection/Stream/Collectors.php @@ -8,7 +8,6 @@ use Munus\Collection\Map; use Munus\Collection\Set; use Munus\Collection\Stream\Collector\GenericCollector; -use Munus\Tuple; use Munus\Tuple\Tuple2; final class Collectors @@ -94,17 +93,17 @@ public static function counting(): Collector } /** - * @return Collector + * @return Collector */ public static function averaging(): Collector { - return new GenericCollector(Tuple::of(0, 0), /** @param T $value */ function (Tuple2 $acc, $value): Tuple2 { + return new GenericCollector(new Tuple2(0, 0), /** @param T $value */ function (Tuple2 $acc, $value): Tuple2 { if (!is_numeric($value)) { throw new \InvalidArgumentException(sprintf('Could not convert %s to number', (string) $value)); } - return Tuple::of($acc[0] + $value, $acc[1] + 1); - }, /** @return int|float */ function (Tuple2 $acc) { + return new Tuple2($acc[0] + $value, $acc[1] + 1); + }, function (Tuple2 $acc): int|float { if ($acc[1] === 0) { return 0; } diff --git a/src/Tuple.php b/src/Tuple.php index 52e4340..c1057b8 100644 --- a/src/Tuple.php +++ b/src/Tuple.php @@ -16,6 +16,9 @@ use Munus\Tuple\Tuple8; use Munus\Value\Comparator; +/** + * @implements \ArrayAccess + */ abstract class Tuple implements \ArrayAccess { public const TUPLE_MAX_SIZE = 8; @@ -23,7 +26,7 @@ abstract class Tuple implements \ArrayAccess /** * @param mixed ...$values */ - public static function of(...$values) + public static function of(...$values): self { return match (count($values)) { 0 => new Tuple0(), @@ -41,9 +44,26 @@ public static function of(...$values) abstract public function arity(): int; + /** + * @return mixed[] + */ abstract public function toArray(): array; - public function concat(Tuple0|Tuple1|Tuple2|Tuple3|Tuple4|Tuple5|Tuple6|Tuple7|Tuple8 $tuple): Tuple0|Tuple1|Tuple2|Tuple3|Tuple4|Tuple5|Tuple6|Tuple7|Tuple8 + /** + * @template T + * + * @param T $value + */ + abstract public function append($value): self; + + /** + * @template T + * + * @param T $value + */ + abstract public function prepend($value): self; + + public function concat(self $tuple): self { return Tuple::of(...$this->toArray(), ...$tuple->toArray()); } diff --git a/src/Tuple/Tuple0.php b/src/Tuple/Tuple0.php index 7e3aef5..d4cb897 100644 --- a/src/Tuple/Tuple0.php +++ b/src/Tuple/Tuple0.php @@ -22,6 +22,9 @@ public function arity(): int return 0; } + /** + * @return array{} + */ public function toArray(): array { return []; @@ -32,7 +35,7 @@ public function toArray(): array * * @param T $value * - * @returns Tuple1 + * @return Tuple1 */ public function prepend($value): Tuple1 { @@ -44,7 +47,7 @@ public function prepend($value): Tuple1 * * @param T $value * - * @returns Tuple1 + * @return Tuple1 */ public function append($value): Tuple1 { @@ -54,11 +57,11 @@ public function append($value): Tuple1 /** * @param Tuple0 $tuple * - * @returns Tuple0 + * @return Tuple0 */ public function concatTuple0($tuple) { - return $this->concat($tuple); + return new Tuple0(); } /** @@ -66,7 +69,7 @@ public function concatTuple0($tuple) * * @param Tuple1 $tuple * - * @returns Tuple1 + * @return Tuple1 */ public function concatTuple1($tuple) { @@ -79,7 +82,7 @@ public function concatTuple1($tuple) * * @param Tuple2 $tuple * - * @returns Tuple2 + * @return Tuple2 */ public function concatTuple2($tuple) { @@ -93,7 +96,7 @@ public function concatTuple2($tuple) * * @param Tuple3 $tuple * - * @returns Tuple3 + * @return Tuple3 */ public function concatTuple3($tuple) { @@ -108,7 +111,7 @@ public function concatTuple3($tuple) * * @param Tuple4 $tuple * - * @returns Tuple4 + * @return Tuple4 */ public function concatTuple4($tuple) { @@ -124,7 +127,7 @@ public function concatTuple4($tuple) * * @param Tuple5 $tuple * - * @returns Tuple5 + * @return Tuple5 */ public function concatTuple5($tuple) { @@ -141,7 +144,7 @@ public function concatTuple5($tuple) * * @param Tuple6 $tuple * - * @returns Tuple6 + * @return Tuple6 */ public function concatTuple6($tuple) { @@ -159,7 +162,7 @@ public function concatTuple6($tuple) * * @param Tuple7 $tuple * - * @returns Tuple7 + * @return Tuple7 */ public function concatTuple7($tuple) { @@ -178,7 +181,7 @@ public function concatTuple7($tuple) * * @param Tuple8 $tuple * - * @returns Tuple8 + * @return Tuple8 */ public function concatTuple8($tuple) { diff --git a/src/Tuple/Tuple1.php b/src/Tuple/Tuple1.php index 0819fa1..42b2893 100644 --- a/src/Tuple/Tuple1.php +++ b/src/Tuple/Tuple1.php @@ -29,6 +29,9 @@ public function arity(): int return 1; } + /** + * @return array{T1} + */ public function toArray(): array { return [ @@ -41,7 +44,7 @@ public function toArray(): array * * @param T $value * - * @returns Tuple2 + * @return Tuple2 */ public function prepend($value): Tuple2 { @@ -53,7 +56,7 @@ public function prepend($value): Tuple2 * * @param T $value * - * @returns Tuple2 + * @return Tuple2 */ public function append($value): Tuple2 { @@ -63,7 +66,7 @@ public function append($value): Tuple2 /** * @param Tuple0 $tuple * - * @returns Tuple1 + * @return Tuple1 */ public function concatTuple0($tuple) { @@ -75,7 +78,7 @@ public function concatTuple0($tuple) * * @param Tuple1 $tuple * - * @returns Tuple2 + * @return Tuple2 */ public function concatTuple1($tuple) { @@ -88,7 +91,7 @@ public function concatTuple1($tuple) * * @param Tuple2 $tuple * - * @returns Tuple3 + * @return Tuple3 */ public function concatTuple2($tuple) { @@ -102,7 +105,7 @@ public function concatTuple2($tuple) * * @param Tuple3 $tuple * - * @returns Tuple4 + * @return Tuple4 */ public function concatTuple3($tuple) { @@ -117,7 +120,7 @@ public function concatTuple3($tuple) * * @param Tuple4 $tuple * - * @returns Tuple5 + * @return Tuple5 */ public function concatTuple4($tuple) { @@ -133,7 +136,7 @@ public function concatTuple4($tuple) * * @param Tuple5 $tuple * - * @returns Tuple6 + * @return Tuple6 */ public function concatTuple5($tuple) { @@ -150,7 +153,7 @@ public function concatTuple5($tuple) * * @param Tuple6 $tuple * - * @returns Tuple7 + * @return Tuple7 */ public function concatTuple6($tuple) { @@ -168,7 +171,7 @@ public function concatTuple6($tuple) * * @param Tuple7 $tuple * - * @returns Tuple8 + * @return Tuple8 */ public function concatTuple7($tuple) { diff --git a/src/Tuple/Tuple2.php b/src/Tuple/Tuple2.php index b910361..2bca178 100644 --- a/src/Tuple/Tuple2.php +++ b/src/Tuple/Tuple2.php @@ -32,6 +32,9 @@ public function arity(): int return 2; } + /** + * @return array{T1, T2} + */ public function toArray(): array { return [ @@ -45,7 +48,7 @@ public function toArray(): array * * @param T $value * - * @returns Tuple3 + * @return Tuple3 */ public function prepend($value): Tuple3 { @@ -57,7 +60,7 @@ public function prepend($value): Tuple3 * * @param T $value * - * @returns Tuple3 + * @return Tuple3 */ public function append($value): Tuple3 { @@ -67,7 +70,7 @@ public function append($value): Tuple3 /** * @param Tuple0 $tuple * - * @returns Tuple2 + * @return Tuple2 */ public function concatTuple0($tuple) { @@ -79,7 +82,7 @@ public function concatTuple0($tuple) * * @param Tuple1 $tuple * - * @returns Tuple3 + * @return Tuple3 */ public function concatTuple1($tuple) { @@ -92,7 +95,7 @@ public function concatTuple1($tuple) * * @param Tuple2 $tuple * - * @returns Tuple4 + * @return Tuple4 */ public function concatTuple2($tuple) { @@ -106,7 +109,7 @@ public function concatTuple2($tuple) * * @param Tuple3 $tuple * - * @returns Tuple5 + * @return Tuple5 */ public function concatTuple3($tuple) { @@ -121,7 +124,7 @@ public function concatTuple3($tuple) * * @param Tuple4 $tuple * - * @returns Tuple6 + * @return Tuple6 */ public function concatTuple4($tuple) { @@ -137,7 +140,7 @@ public function concatTuple4($tuple) * * @param Tuple5 $tuple * - * @returns Tuple7 + * @return Tuple7 */ public function concatTuple5($tuple) { @@ -154,7 +157,7 @@ public function concatTuple5($tuple) * * @param Tuple6 $tuple * - * @returns Tuple8 + * @return Tuple8 */ public function concatTuple6($tuple) { diff --git a/src/Tuple/Tuple3.php b/src/Tuple/Tuple3.php index 3558f64..a66af8a 100644 --- a/src/Tuple/Tuple3.php +++ b/src/Tuple/Tuple3.php @@ -35,6 +35,9 @@ public function arity(): int return 3; } + /** + * @return array{T1, T2, T3} + */ public function toArray(): array { return [ @@ -49,7 +52,7 @@ public function toArray(): array * * @param T $value * - * @returns Tuple4 + * @return Tuple4 */ public function prepend($value): Tuple4 { @@ -61,7 +64,7 @@ public function prepend($value): Tuple4 * * @param T $value * - * @returns Tuple4 + * @return Tuple4 */ public function append($value): Tuple4 { @@ -71,7 +74,7 @@ public function append($value): Tuple4 /** * @param Tuple0 $tuple * - * @returns Tuple3 + * @return Tuple3 */ public function concatTuple0($tuple) { @@ -83,7 +86,7 @@ public function concatTuple0($tuple) * * @param Tuple1 $tuple * - * @returns Tuple4 + * @return Tuple4 */ public function concatTuple1($tuple) { @@ -96,7 +99,7 @@ public function concatTuple1($tuple) * * @param Tuple2 $tuple * - * @returns Tuple5 + * @return Tuple5 */ public function concatTuple2($tuple) { @@ -110,7 +113,7 @@ public function concatTuple2($tuple) * * @param Tuple3 $tuple * - * @returns Tuple6 + * @return Tuple6 */ public function concatTuple3($tuple) { @@ -125,7 +128,7 @@ public function concatTuple3($tuple) * * @param Tuple4 $tuple * - * @returns Tuple7 + * @return Tuple7 */ public function concatTuple4($tuple) { @@ -141,7 +144,7 @@ public function concatTuple4($tuple) * * @param Tuple5 $tuple * - * @returns Tuple8 + * @return Tuple8 */ public function concatTuple5($tuple) { diff --git a/src/Tuple/Tuple4.php b/src/Tuple/Tuple4.php index 9b6370d..dcacbbc 100644 --- a/src/Tuple/Tuple4.php +++ b/src/Tuple/Tuple4.php @@ -38,6 +38,9 @@ public function arity(): int return 4; } + /** + * @return array{T1, T2, T3, T4} + */ public function toArray(): array { return [ @@ -53,7 +56,7 @@ public function toArray(): array * * @param T $value * - * @returns Tuple5 + * @return Tuple5 */ public function prepend($value): Tuple5 { @@ -65,7 +68,7 @@ public function prepend($value): Tuple5 * * @param T $value * - * @returns Tuple5 + * @return Tuple5 */ public function append($value): Tuple5 { @@ -75,7 +78,7 @@ public function append($value): Tuple5 /** * @param Tuple0 $tuple * - * @returns Tuple4 + * @return Tuple4 */ public function concatTuple0($tuple) { @@ -87,7 +90,7 @@ public function concatTuple0($tuple) * * @param Tuple1 $tuple * - * @returns Tuple5 + * @return Tuple5 */ public function concatTuple1($tuple) { @@ -100,7 +103,7 @@ public function concatTuple1($tuple) * * @param Tuple2 $tuple * - * @returns Tuple6 + * @return Tuple6 */ public function concatTuple2($tuple) { @@ -114,7 +117,7 @@ public function concatTuple2($tuple) * * @param Tuple3 $tuple * - * @returns Tuple7 + * @return Tuple7 */ public function concatTuple3($tuple) { @@ -129,7 +132,7 @@ public function concatTuple3($tuple) * * @param Tuple4 $tuple * - * @returns Tuple8 + * @return Tuple8 */ public function concatTuple4($tuple) { diff --git a/src/Tuple/Tuple5.php b/src/Tuple/Tuple5.php index 2c5890c..43a5605 100644 --- a/src/Tuple/Tuple5.php +++ b/src/Tuple/Tuple5.php @@ -41,6 +41,9 @@ public function arity(): int return 5; } + /** + * @return array{T1, T2, T3, T4, T5} + */ public function toArray(): array { return [ @@ -57,7 +60,7 @@ public function toArray(): array * * @param T $value * - * @returns Tuple6 + * @return Tuple6 */ public function prepend($value): Tuple6 { @@ -69,7 +72,7 @@ public function prepend($value): Tuple6 * * @param T $value * - * @returns Tuple6 + * @return Tuple6 */ public function append($value): Tuple6 { @@ -79,7 +82,7 @@ public function append($value): Tuple6 /** * @param Tuple0 $tuple * - * @returns Tuple5 + * @return Tuple5 */ public function concatTuple0($tuple) { @@ -91,7 +94,7 @@ public function concatTuple0($tuple) * * @param Tuple1 $tuple * - * @returns Tuple6 + * @return Tuple6 */ public function concatTuple1($tuple) { @@ -104,7 +107,7 @@ public function concatTuple1($tuple) * * @param Tuple2 $tuple * - * @returns Tuple7 + * @return Tuple7 */ public function concatTuple2($tuple) { @@ -118,7 +121,7 @@ public function concatTuple2($tuple) * * @param Tuple3 $tuple * - * @returns Tuple8 + * @return Tuple8 */ public function concatTuple3($tuple) { diff --git a/src/Tuple/Tuple6.php b/src/Tuple/Tuple6.php index 54734a4..951808b 100644 --- a/src/Tuple/Tuple6.php +++ b/src/Tuple/Tuple6.php @@ -44,6 +44,9 @@ public function arity(): int return 6; } + /** + * @return array{T1, T2, T3, T4, T5, T6} + */ public function toArray(): array { return [ @@ -61,7 +64,7 @@ public function toArray(): array * * @param T $value * - * @returns Tuple7 + * @return Tuple7 */ public function prepend($value): Tuple7 { @@ -73,7 +76,7 @@ public function prepend($value): Tuple7 * * @param T $value * - * @returns Tuple7 + * @return Tuple7 */ public function append($value): Tuple7 { @@ -83,7 +86,7 @@ public function append($value): Tuple7 /** * @param Tuple0 $tuple * - * @returns Tuple6 + * @return Tuple6 */ public function concatTuple0($tuple) { @@ -95,7 +98,7 @@ public function concatTuple0($tuple) * * @param Tuple1 $tuple * - * @returns Tuple7 + * @return Tuple7 */ public function concatTuple1($tuple) { @@ -108,7 +111,7 @@ public function concatTuple1($tuple) * * @param Tuple2 $tuple * - * @returns Tuple8 + * @return Tuple8 */ public function concatTuple2($tuple) { diff --git a/src/Tuple/Tuple7.php b/src/Tuple/Tuple7.php index 8d63279..fcb2b46 100644 --- a/src/Tuple/Tuple7.php +++ b/src/Tuple/Tuple7.php @@ -47,6 +47,9 @@ public function arity(): int return 7; } + /** + * @return array{T1, T2, T3, T4, T5, T6, T7} + */ public function toArray(): array { return [ @@ -65,7 +68,7 @@ public function toArray(): array * * @param T $value * - * @returns Tuple8 + * @return Tuple8 */ public function prepend($value): Tuple8 { @@ -77,7 +80,7 @@ public function prepend($value): Tuple8 * * @param T $value * - * @returns Tuple8 + * @return Tuple8 */ public function append($value): Tuple8 { @@ -87,7 +90,7 @@ public function append($value): Tuple8 /** * @param Tuple0 $tuple * - * @returns Tuple7 + * @return Tuple7 */ public function concatTuple0($tuple) { @@ -99,7 +102,7 @@ public function concatTuple0($tuple) * * @param Tuple1 $tuple * - * @returns Tuple8 + * @return Tuple8 */ public function concatTuple1($tuple) { diff --git a/src/Tuple/Tuple8.php b/src/Tuple/Tuple8.php index 2fd845f..cee41d5 100644 --- a/src/Tuple/Tuple8.php +++ b/src/Tuple/Tuple8.php @@ -51,6 +51,9 @@ public function arity(): int return 8; } + /** + * @return array{T1, T2, T3, T4, T5, T6, T7, T8} + */ public function toArray(): array { return [ @@ -65,12 +68,22 @@ public function toArray(): array ]; } - public function prepend($value) + /** + * @template T + * + * @param T $value + */ + public function prepend($value): never { throw new UnsupportedOperationException('Can\'t prepend next value. This is biggest possible Tuple'); } - public function append($value) + /** + * @template T + * + * @param T $value + */ + public function append($value): never { throw new UnsupportedOperationException('Can\'t append next value. This is biggest possible Tuple'); } @@ -78,7 +91,7 @@ public function append($value) /** * @param Tuple0 $tuple * - * @returns Tuple8 + * @return Tuple8 */ public function concatTuple0($tuple) { diff --git a/tests/TupleTest.php b/tests/TupleTest.php index f399201..41bed64 100644 --- a/tests/TupleTest.php +++ b/tests/TupleTest.php @@ -181,7 +181,7 @@ public function testPrependToTuple8(): void public function testTupleApply(): void { - self::assertEquals(6, Tuple::of(1, 2, 3)->apply(function (int $a, int $b, int $c): int {return $a + $b + $c; })); + self::assertEquals(6, Tuple::of(1, 2, 3)->apply(function (int $a, int $b, int $c): int {return $a + $b + $c; })); // @phpstan-ignore-line self::assertEquals('Munus', Tuple::of('M', 'u', 'n', 'u', 's')->apply(function () {return join('', func_get_args()); })); }