Skip to content

Commit 3116a1b

Browse files
herndlmondrejmirtes
authored andcommitted
Add Type::reverseArray()
1 parent 08dc679 commit 3116a1b

20 files changed

+177
-27
lines changed

src/Type/Accessory/AccessoryArrayListType.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,15 @@ public function popArray(): Type
218218
return $this;
219219
}
220220

221+
public function reverseArray(TrinaryLogic $preserveKeys): Type
222+
{
223+
if ($preserveKeys->no()) {
224+
return $this;
225+
}
226+
227+
return new MixedType();
228+
}
229+
221230
public function searchArray(Type $needleType): Type
222231
{
223232
return new MixedType();

src/Type/Accessory/HasOffsetType.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,15 @@ public function intersectKeyArray(Type $otherArraysType): Type
189189
return new MixedType();
190190
}
191191

192+
public function reverseArray(TrinaryLogic $preserveKeys): Type
193+
{
194+
if ($preserveKeys->yes()) {
195+
return $this;
196+
}
197+
198+
return new NonEmptyArrayType();
199+
}
200+
192201
public function shuffleArray(): Type
193202
{
194203
return new NonEmptyArrayType();

src/Type/Accessory/HasOffsetValueType.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,15 @@ public function intersectKeyArray(Type $otherArraysType): Type
233233
return new MixedType();
234234
}
235235

236+
public function reverseArray(TrinaryLogic $preserveKeys): Type
237+
{
238+
if ($preserveKeys->yes()) {
239+
return $this;
240+
}
241+
242+
return new NonEmptyArrayType();
243+
}
244+
236245
public function searchArray(Type $needleType): Type
237246
{
238247
if (

src/Type/Accessory/NonEmptyArrayType.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,11 @@ public function popArray(): Type
199199
return new MixedType();
200200
}
201201

202+
public function reverseArray(TrinaryLogic $preserveKeys): Type
203+
{
204+
return $this;
205+
}
206+
202207
public function searchArray(Type $needleType): Type
203208
{
204209
return new MixedType();

src/Type/Accessory/OversizedArrayType.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,11 @@ public function popArray(): Type
195195
return $this;
196196
}
197197

198+
public function reverseArray(TrinaryLogic $preserveKeys): Type
199+
{
200+
return $this;
201+
}
202+
198203
public function searchArray(Type $needleType): Type
199204
{
200205
return new MixedType();

src/Type/ArrayType.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,11 @@ public function popArray(): Type
552552
return $this;
553553
}
554554

555+
public function reverseArray(TrinaryLogic $preserveKeys): Type
556+
{
557+
return $this;
558+
}
559+
555560
public function searchArray(Type $needleType): Type
556561
{
557562
return TypeCombinator::union($this->getIterableKeyType(), new ConstantBooleanType(false));

src/Type/Constant/ConstantArrayType.php

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -837,6 +837,23 @@ public function popArray(): Type
837837
return $this->removeLastElements(1);
838838
}
839839

840+
private function reverseConstantArray(TrinaryLogic $preserveKeys): self
841+
{
842+
$keyTypesReversed = array_reverse($this->keyTypes, true);
843+
$keyTypes = array_values($keyTypesReversed);
844+
$keyTypesReversedKeys = array_keys($keyTypesReversed);
845+
$optionalKeys = array_map(static fn (int $optionalKey): int => $keyTypesReversedKeys[$optionalKey], $this->optionalKeys);
846+
847+
$reversed = new self($keyTypes, array_reverse($this->valueTypes), $this->nextAutoIndexes, $optionalKeys, TrinaryLogic::createNo());
848+
849+
return $preserveKeys->yes() ? $reversed : $reversed->reindex();
850+
}
851+
852+
public function reverseArray(TrinaryLogic $preserveKeys): Type
853+
{
854+
return $this->reverseConstantArray($preserveKeys);
855+
}
856+
840857
public function searchArray(Type $needleType): Type
841858
{
842859
$matches = [];
@@ -1121,9 +1138,9 @@ public function slice(int $offset, ?int $limit, bool $preserveKeys = false): sel
11211138
$offset *= -1;
11221139
$reversedLimit = min($limit, $offset);
11231140
$reversedOffset = $offset - $reversedLimit;
1124-
return $this->reverse(true)
1141+
return $this->reverseConstantArray(TrinaryLogic::createYes())
11251142
->slice($reversedOffset, $reversedLimit, $preserveKeys)
1126-
->reverse(true);
1143+
->reverseConstantArray(TrinaryLogic::createYes());
11271144
}
11281145

11291146
if ($offset > 0) {
@@ -1162,16 +1179,10 @@ public function slice(int $offset, ?int $limit, bool $preserveKeys = false): sel
11621179
return $preserveKeys ? $slice : $slice->reindex();
11631180
}
11641181

1182+
/** @deprecated Use reverseArray() instead */
11651183
public function reverse(bool $preserveKeys = false): self
11661184
{
1167-
$keyTypesReversed = array_reverse($this->keyTypes, true);
1168-
$keyTypes = array_values($keyTypesReversed);
1169-
$keyTypesReversedKeys = array_keys($keyTypesReversed);
1170-
$optionalKeys = array_map(static fn (int $optionalKey): int => $keyTypesReversedKeys[$optionalKey], $this->optionalKeys);
1171-
1172-
$reversed = new self($keyTypes, array_reverse($this->valueTypes), $this->nextAutoIndexes, $optionalKeys, TrinaryLogic::createNo());
1173-
1174-
return $preserveKeys ? $reversed : $reversed->reindex();
1185+
return $this->reverseConstantArray(TrinaryLogic::createFromBoolean($preserveKeys));
11751186
}
11761187

11771188
/** @param positive-int $length */

src/Type/IntersectionType.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -744,6 +744,11 @@ public function popArray(): Type
744744
return $this->intersectTypes(static fn (Type $type): Type => $type->popArray());
745745
}
746746

747+
public function reverseArray(TrinaryLogic $preserveKeys): Type
748+
{
749+
return $this->intersectTypes(static fn (Type $type): Type => $type->reverseArray($preserveKeys));
750+
}
751+
747752
public function searchArray(Type $needleType): Type
748753
{
749754
return $this->intersectTypes(static fn (Type $type): Type => $type->searchArray($needleType));

src/Type/MixedType.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,15 @@ public function popArray(): Type
225225
return new ArrayType(new MixedType($this->isExplicitMixed), new MixedType($this->isExplicitMixed));
226226
}
227227

228+
public function reverseArray(TrinaryLogic $preserveKeys): Type
229+
{
230+
if ($this->isArray()->no()) {
231+
return new ErrorType();
232+
}
233+
234+
return new ArrayType(new MixedType($this->isExplicitMixed), new MixedType($this->isExplicitMixed));
235+
}
236+
228237
public function searchArray(Type $needleType): Type
229238
{
230239
if ($this->isArray()->no()) {

src/Type/NeverType.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,11 @@ public function popArray(): Type
316316
return new NeverType();
317317
}
318318

319+
public function reverseArray(TrinaryLogic $preserveKeys): Type
320+
{
321+
return new NeverType();
322+
}
323+
319324
public function searchArray(Type $needleType): Type
320325
{
321326
return new NeverType();

0 commit comments

Comments
 (0)