Khaleel Al-Adhami преди 6 месеца
родител
ревизия
2b05ee98ed
променени са 1 файла, в които са добавени 49 реда и са изтрити 2 реда
  1. 49 2
      reflex/vars/sequence.py

+ 49 - 2
reflex/vars/sequence.py

@@ -409,6 +409,51 @@ def string_split_operation(
     )
     )
 
 
 
 
+def _element_type(array: Var, index: Var) -> Any:
+    array_args = typing.get_args(array._var_type)
+
+    if (
+        array_args
+        and isinstance(index, LiteralNumberVar)
+        and is_tuple_type(array._var_type)
+    ):
+        index_value = int(index._var_value)
+        return array_args[index_value % len(array_args)]
+
+    return unionize(*(array_arg for array_arg in array_args if array_arg is not ...))
+
+
+@var_operation
+def array_item_or_slice_operation(
+    array: Var[Sequence[INNER_ARRAY_VAR]],
+    index_or_slice: Var[Union[int, slice]],
+) -> CustomVarOperationReturn[Union[INNER_ARRAY_VAR, Sequence[INNER_ARRAY_VAR]]]:
+    """Get an item or slice from an array.
+
+    Args:
+        array: The array.
+        index_or_slice: The index or slice.
+
+    Returns:
+        The item or slice from the array.
+    """
+    return var_operation_return(
+        js_expression=f"Array.isArray({index_or_slice}) ? at_slice({array}, {index_or_slice}) : {array}.at({index_or_slice})",
+        type_computer=nary_type_computer(
+            ReflexCallable[[Sequence, Union[int, slice]], Any],
+            ReflexCallable[[Union[int, slice]], Any],
+            computer=lambda args: (
+                args[0]._var_type
+                if args[1]._var_type is slice
+                else (_element_type(args[0], args[1]))
+            ),
+        ),
+        var_data=VarData(
+            imports=_AT_SLICE_IMPORT,
+        ),
+    )
+
+
 @var_operation
 @var_operation
 def array_slice_operation(
 def array_slice_operation(
     array: Var[Sequence[INNER_ARRAY_VAR]],
     array: Var[Sequence[INNER_ARRAY_VAR]],
@@ -424,7 +469,7 @@ def array_slice_operation(
         The item or slice from the array.
         The item or slice from the array.
     """
     """
     return var_operation_return(
     return var_operation_return(
-        js_expression=f"at_slice({array}, {slice})",
+        js_expression=f"atSlice({array}, {slice})",
         type_computer=nary_type_computer(
         type_computer=nary_type_computer(
             ReflexCallable[[List, slice], Any],
             ReflexCallable[[List, slice], Any],
             ReflexCallable[[slice], Any],
             ReflexCallable[[slice], Any],
@@ -813,7 +858,9 @@ class ArrayVar(Var[ARRAY_VAR_TYPE], python_types=(Sequence, set)):
 
 
     __add__ = array_concat_operation
     __add__ = array_concat_operation
 
 
-    __getitem__ = array_item_operation
+    __getitem__ = array_item_or_slice_operation
+
+    at = array_item_operation
 
 
     slice = array_slice_operation
     slice = array_slice_operation