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