51
51
use function array_merge ;
52
52
use function array_pop ;
53
53
use function array_push ;
54
- use function array_reverse ;
55
54
use function array_slice ;
56
55
use function array_unique ;
57
56
use function array_values ;
@@ -241,7 +240,7 @@ public function getAllArrays(): array
241
240
}
242
241
243
242
$ array = $ builder ->getArray ();
244
- if (!$ array instanceof ConstantArrayType ) {
243
+ if (!$ array instanceof self ) {
245
244
throw new ShouldNotHappenException ();
246
245
}
247
246
@@ -857,14 +856,16 @@ public function popArray(): Type
857
856
858
857
public function reverseArray (TrinaryLogic $ preserveKeys ): Type
859
858
{
860
- $ keyTypesReversed = array_reverse ($ this ->keyTypes , true );
861
- $ keyTypes = array_values ($ keyTypesReversed );
862
- $ keyTypesReversedKeys = array_keys ($ keyTypesReversed );
863
- $ optionalKeys = array_map (static fn (int $ optionalKey ): int => $ keyTypesReversedKeys [$ optionalKey ], $ this ->optionalKeys );
859
+ $ builder = ConstantArrayTypeBuilder::createEmpty ();
864
860
865
- $ reversed = new self ($ keyTypes , array_reverse ($ this ->valueTypes ), $ this ->nextAutoIndexes , $ optionalKeys , TrinaryLogic::createNo ());
861
+ for ($ i = count ($ this ->keyTypes ) - 1 ; $ i >= 0 ; $ i --) {
862
+ $ offsetType = $ preserveKeys ->yes () || $ this ->keyTypes [$ i ]->isInteger ()->no ()
863
+ ? $ this ->keyTypes [$ i ]
864
+ : null ;
865
+ $ builder ->setOffsetValueType ($ offsetType , $ this ->valueTypes [$ i ], $ this ->isOptionalKey ($ i ));
866
+ }
866
867
867
- return $ preserveKeys -> yes () ? $ reversed : $ reversed -> reindex ();
868
+ return $ builder -> getArray ();
868
869
}
869
870
870
871
public function searchArray (Type $ needleType ): Type
@@ -993,15 +994,14 @@ public function sliceArray(Type $offsetType, Type $lengthType, TrinaryLogic $pre
993
994
$ isOptional = true ;
994
995
}
995
996
996
- $ builder ->setOffsetValueType ($ this ->keyTypes [$ i ], $ this ->valueTypes [$ i ], $ isOptional );
997
- }
997
+ $ offsetType = $ preserveKeys ->yes () || $ this ->keyTypes [$ i ]->isInteger ()->no ()
998
+ ? $ this ->keyTypes [$ i ]
999
+ : null ;
998
1000
999
- $ slice = $ builder ->getArray ();
1000
- if (!$ slice instanceof self) {
1001
- throw new ShouldNotHappenException ();
1001
+ $ builder ->setOffsetValueType ($ offsetType , $ this ->valueTypes [$ i ], $ isOptional );
1002
1002
}
1003
1003
1004
- return $ preserveKeys -> yes () ? $ slice : $ slice -> reindex ();
1004
+ return $ builder -> getArray ();
1005
1005
}
1006
1006
1007
1007
public function isIterableAtLeastOnce (): TrinaryLogic
@@ -1147,7 +1147,7 @@ private function removeLastElements(int $length): self
1147
1147
}
1148
1148
1149
1149
/** @param positive-int $length */
1150
- private function removeFirstElements (int $ length , bool $ reindex = true ): self
1150
+ private function removeFirstElements (int $ length , bool $ reindex = true ): Type
1151
1151
{
1152
1152
$ builder = ConstantArrayTypeBuilder::createEmpty ();
1153
1153
@@ -1174,30 +1174,7 @@ private function removeFirstElements(int $length, bool $reindex = true): self
1174
1174
$ builder ->setOffsetValueType ($ keyType , $ valueType , $ isOptional );
1175
1175
}
1176
1176
1177
- $ array = $ builder ->getArray ();
1178
- if (!$ array instanceof self) {
1179
- throw new ShouldNotHappenException ();
1180
- }
1181
-
1182
- return $ array ;
1183
- }
1184
-
1185
- private function reindex (): self
1186
- {
1187
- $ keyTypes = [];
1188
- $ autoIndex = 0 ;
1189
-
1190
- foreach ($ this ->keyTypes as $ keyType ) {
1191
- if (!$ keyType instanceof ConstantIntegerType) {
1192
- $ keyTypes [] = $ keyType ;
1193
- continue ;
1194
- }
1195
-
1196
- $ keyTypes [] = new ConstantIntegerType ($ autoIndex );
1197
- $ autoIndex ++;
1198
- }
1199
-
1200
- return new self ($ keyTypes , $ this ->valueTypes , [$ autoIndex ], $ this ->optionalKeys , TrinaryLogic::createYes ());
1177
+ return $ builder ->getArray ();
1201
1178
}
1202
1179
1203
1180
public function toBoolean (): BooleanType
0 commit comments