diff --git a/reflex/vars/function.py b/reflex/vars/function.py index c3fe8f75f..121e6f6c4 100644 --- a/reflex/vars/function.py +++ b/reflex/vars/function.py @@ -6,8 +6,10 @@ import dataclasses import inspect import sys from typing import ( + TYPE_CHECKING, Any, Callable, + Mapping, NoReturn, Optional, Sequence, @@ -35,6 +37,11 @@ from .base import ( unwrap_reflex_callalbe, ) +if TYPE_CHECKING: + from .number import BooleanVar, NumberVar + from .object import ObjectVar + from .sequence import ArrayVar, StringVar + P = ParamSpec("P") R = TypeVar("R") R2 = TypeVar("R2") @@ -51,6 +58,9 @@ OTHER_CALLABLE_TYPE = TypeVar( "OTHER_CALLABLE_TYPE", bound=ReflexCallable, infer_variance=True ) +MAPPING_TYPE = TypeVar("MAPPING_TYPE", bound=Mapping, covariant=True) +SEQUENCE_TYPE = TypeVar("SEQUENCE_TYPE", bound=Sequence, covariant=True) + def type_is_reflex_callable(type_: Any) -> bool: """Check if a type is a ReflexCallable. @@ -64,6 +74,11 @@ def type_is_reflex_callable(type_: Any) -> bool: return type_ is ReflexCallable or get_origin(type_) is ReflexCallable +K = TypeVar("K", covariant=True) +V = TypeVar("V", covariant=True) +T = TypeVar("T", covariant=True) + + class FunctionVar( Var[CALLABLE_TYPE], default_type=ReflexCallable[Any, Any], @@ -196,8 +211,78 @@ class FunctionVar( _var_type=partial_types, ) + # THIS CODE IS GENERATED BY `_generate_overloads_for_function_var_call` function below. + @overload - def call(self: FunctionVar[ReflexCallable[[], R]]) -> Var[R]: ... + def call( + self: FunctionVar[ReflexCallable[[], bool]], + ) -> BooleanVar: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[], int]], + ) -> NumberVar[int]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[], float]], + ) -> NumberVar[float]: ... + + @overload + def call( # pyright: ignore[reportOverlappingOverload] + self: FunctionVar[ReflexCallable[[], str]], + ) -> StringVar[str]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[], SEQUENCE_TYPE]], + ) -> ArrayVar[SEQUENCE_TYPE]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[], MAPPING_TYPE]], + ) -> ObjectVar[MAPPING_TYPE]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[], R]], + ) -> Var[R]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[VarWithDefault[V1]], bool]], + arg1: Union[V1, Var[V1], Unset] = Unset(), + ) -> BooleanVar: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[VarWithDefault[V1]], int]], + arg1: Union[V1, Var[V1], Unset] = Unset(), + ) -> NumberVar[int]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[VarWithDefault[V1]], float]], + arg1: Union[V1, Var[V1], Unset] = Unset(), + ) -> NumberVar[float]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[VarWithDefault[V1]], str]], + arg1: Union[V1, Var[V1], Unset] = Unset(), + ) -> StringVar[str]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[VarWithDefault[V1]], SEQUENCE_TYPE]], + arg1: Union[V1, Var[V1], Unset] = Unset(), + ) -> ArrayVar[SEQUENCE_TYPE]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[VarWithDefault[V1]], MAPPING_TYPE]], + arg1: Union[V1, Var[V1], Unset] = Unset(), + ) -> ObjectVar[MAPPING_TYPE]: ... @overload def call( @@ -205,6 +290,60 @@ class FunctionVar( arg1: Union[V1, Var[V1], Unset] = Unset(), ) -> Var[R]: ... + @overload + def call( + self: FunctionVar[ + ReflexCallable[[VarWithDefault[V1], VarWithDefault[V2]], bool] + ], + arg1: Union[V1, Var[V1], Unset] = Unset(), + arg2: Union[V2, Var[V2], Unset] = Unset(), + ) -> BooleanVar: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[[VarWithDefault[V1], VarWithDefault[V2]], int] + ], + arg1: Union[V1, Var[V1], Unset] = Unset(), + arg2: Union[V2, Var[V2], Unset] = Unset(), + ) -> NumberVar[int]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[[VarWithDefault[V1], VarWithDefault[V2]], float] + ], + arg1: Union[V1, Var[V1], Unset] = Unset(), + arg2: Union[V2, Var[V2], Unset] = Unset(), + ) -> NumberVar[float]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[[VarWithDefault[V1], VarWithDefault[V2]], str] + ], + arg1: Union[V1, Var[V1], Unset] = Unset(), + arg2: Union[V2, Var[V2], Unset] = Unset(), + ) -> StringVar[str]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[[VarWithDefault[V1], VarWithDefault[V2]], SEQUENCE_TYPE] + ], + arg1: Union[V1, Var[V1], Unset] = Unset(), + arg2: Union[V2, Var[V2], Unset] = Unset(), + ) -> ArrayVar[SEQUENCE_TYPE]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[[VarWithDefault[V1], VarWithDefault[V2]], MAPPING_TYPE] + ], + arg1: Union[V1, Var[V1], Unset] = Unset(), + arg2: Union[V2, Var[V2], Unset] = Unset(), + ) -> ObjectVar[MAPPING_TYPE]: ... + @overload def call( self: FunctionVar[ReflexCallable[[VarWithDefault[V1], VarWithDefault[V2]], R]], @@ -212,6 +351,80 @@ class FunctionVar( arg2: Union[V2, Var[V2], Unset] = Unset(), ) -> Var[R]: ... + @overload + def call( + self: FunctionVar[ + ReflexCallable[ + [VarWithDefault[V1], VarWithDefault[V2], VarWithDefault[V3]], bool + ] + ], + arg1: Union[V1, Var[V1], Unset] = Unset(), + arg2: Union[V2, Var[V2], Unset] = Unset(), + arg3: Union[V3, Var[V3], Unset] = Unset(), + ) -> BooleanVar: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[ + [VarWithDefault[V1], VarWithDefault[V2], VarWithDefault[V3]], int + ] + ], + arg1: Union[V1, Var[V1], Unset] = Unset(), + arg2: Union[V2, Var[V2], Unset] = Unset(), + arg3: Union[V3, Var[V3], Unset] = Unset(), + ) -> NumberVar[int]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[ + [VarWithDefault[V1], VarWithDefault[V2], VarWithDefault[V3]], float + ] + ], + arg1: Union[V1, Var[V1], Unset] = Unset(), + arg2: Union[V2, Var[V2], Unset] = Unset(), + arg3: Union[V3, Var[V3], Unset] = Unset(), + ) -> NumberVar[float]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[ + [VarWithDefault[V1], VarWithDefault[V2], VarWithDefault[V3]], str + ] + ], + arg1: Union[V1, Var[V1], Unset] = Unset(), + arg2: Union[V2, Var[V2], Unset] = Unset(), + arg3: Union[V3, Var[V3], Unset] = Unset(), + ) -> StringVar[str]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[ + [VarWithDefault[V1], VarWithDefault[V2], VarWithDefault[V3]], + SEQUENCE_TYPE, + ] + ], + arg1: Union[V1, Var[V1], Unset] = Unset(), + arg2: Union[V2, Var[V2], Unset] = Unset(), + arg3: Union[V3, Var[V3], Unset] = Unset(), + ) -> ArrayVar[SEQUENCE_TYPE]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[ + [VarWithDefault[V1], VarWithDefault[V2], VarWithDefault[V3]], + MAPPING_TYPE, + ] + ], + arg1: Union[V1, Var[V1], Unset] = Unset(), + arg2: Union[V2, Var[V2], Unset] = Unset(), + arg3: Union[V3, Var[V3], Unset] = Unset(), + ) -> ObjectVar[MAPPING_TYPE]: ... + @overload def call( self: FunctionVar[ @@ -224,11 +437,216 @@ class FunctionVar( arg3: Union[V3, Var[V3], Unset] = Unset(), ) -> Var[R]: ... + @overload + def call( + self: FunctionVar[ + ReflexCallable[ + [ + VarWithDefault[V1], + VarWithDefault[V2], + VarWithDefault[V3], + VarWithDefault[V4], + ], + bool, + ] + ], + arg1: Union[V1, Var[V1], Unset] = Unset(), + arg2: Union[V2, Var[V2], Unset] = Unset(), + arg3: Union[V3, Var[V3], Unset] = Unset(), + arg4: Union[V4, Var[V4], Unset] = Unset(), + ) -> BooleanVar: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[ + [ + VarWithDefault[V1], + VarWithDefault[V2], + VarWithDefault[V3], + VarWithDefault[V4], + ], + int, + ] + ], + arg1: Union[V1, Var[V1], Unset] = Unset(), + arg2: Union[V2, Var[V2], Unset] = Unset(), + arg3: Union[V3, Var[V3], Unset] = Unset(), + arg4: Union[V4, Var[V4], Unset] = Unset(), + ) -> NumberVar[int]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[ + [ + VarWithDefault[V1], + VarWithDefault[V2], + VarWithDefault[V3], + VarWithDefault[V4], + ], + float, + ] + ], + arg1: Union[V1, Var[V1], Unset] = Unset(), + arg2: Union[V2, Var[V2], Unset] = Unset(), + arg3: Union[V3, Var[V3], Unset] = Unset(), + arg4: Union[V4, Var[V4], Unset] = Unset(), + ) -> NumberVar[float]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[ + [ + VarWithDefault[V1], + VarWithDefault[V2], + VarWithDefault[V3], + VarWithDefault[V4], + ], + str, + ] + ], + arg1: Union[V1, Var[V1], Unset] = Unset(), + arg2: Union[V2, Var[V2], Unset] = Unset(), + arg3: Union[V3, Var[V3], Unset] = Unset(), + arg4: Union[V4, Var[V4], Unset] = Unset(), + ) -> StringVar[str]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[ + [ + VarWithDefault[V1], + VarWithDefault[V2], + VarWithDefault[V3], + VarWithDefault[V4], + ], + SEQUENCE_TYPE, + ] + ], + arg1: Union[V1, Var[V1], Unset] = Unset(), + arg2: Union[V2, Var[V2], Unset] = Unset(), + arg3: Union[V3, Var[V3], Unset] = Unset(), + arg4: Union[V4, Var[V4], Unset] = Unset(), + ) -> ArrayVar[SEQUENCE_TYPE]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[ + [ + VarWithDefault[V1], + VarWithDefault[V2], + VarWithDefault[V3], + VarWithDefault[V4], + ], + MAPPING_TYPE, + ] + ], + arg1: Union[V1, Var[V1], Unset] = Unset(), + arg2: Union[V2, Var[V2], Unset] = Unset(), + arg3: Union[V3, Var[V3], Unset] = Unset(), + arg4: Union[V4, Var[V4], Unset] = Unset(), + ) -> ObjectVar[MAPPING_TYPE]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[ + [ + VarWithDefault[V1], + VarWithDefault[V2], + VarWithDefault[V3], + VarWithDefault[V4], + ], + R, + ] + ], + arg1: Union[V1, Var[V1], Unset] = Unset(), + arg2: Union[V2, Var[V2], Unset] = Unset(), + arg3: Union[V3, Var[V3], Unset] = Unset(), + arg4: Union[V4, Var[V4], Unset] = Unset(), + ) -> Var[R]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1], bool]], arg1: Union[V1, Var[V1]] + ) -> BooleanVar: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1], int]], arg1: Union[V1, Var[V1]] + ) -> NumberVar[int]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1], float]], arg1: Union[V1, Var[V1]] + ) -> NumberVar[float]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1], str]], arg1: Union[V1, Var[V1]] + ) -> StringVar[str]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1], SEQUENCE_TYPE]], arg1: Union[V1, Var[V1]] + ) -> ArrayVar[SEQUENCE_TYPE]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1], MAPPING_TYPE]], arg1: Union[V1, Var[V1]] + ) -> ObjectVar[MAPPING_TYPE]: ... + @overload def call( self: FunctionVar[ReflexCallable[[V1], R]], arg1: Union[V1, Var[V1]] ) -> Var[R]: ... + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, VarWithDefault[V2]], bool]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2], Unset] = Unset(), + ) -> BooleanVar: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, VarWithDefault[V2]], int]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2], Unset] = Unset(), + ) -> NumberVar[int]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, VarWithDefault[V2]], float]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2], Unset] = Unset(), + ) -> NumberVar[float]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, VarWithDefault[V2]], str]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2], Unset] = Unset(), + ) -> StringVar[str]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, VarWithDefault[V2]], SEQUENCE_TYPE]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2], Unset] = Unset(), + ) -> ArrayVar[SEQUENCE_TYPE]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, VarWithDefault[V2]], MAPPING_TYPE]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2], Unset] = Unset(), + ) -> ObjectVar[MAPPING_TYPE]: ... + @overload def call( self: FunctionVar[ReflexCallable[[V1, VarWithDefault[V2]], R]], @@ -236,6 +654,66 @@ class FunctionVar( arg2: Union[V2, Var[V2], Unset] = Unset(), ) -> Var[R]: ... + @overload + def call( + self: FunctionVar[ + ReflexCallable[[V1, VarWithDefault[V2], VarWithDefault[V3]], bool] + ], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2], Unset] = Unset(), + arg3: Union[V3, Var[V3], Unset] = Unset(), + ) -> BooleanVar: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[[V1, VarWithDefault[V2], VarWithDefault[V3]], int] + ], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2], Unset] = Unset(), + arg3: Union[V3, Var[V3], Unset] = Unset(), + ) -> NumberVar[int]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[[V1, VarWithDefault[V2], VarWithDefault[V3]], float] + ], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2], Unset] = Unset(), + arg3: Union[V3, Var[V3], Unset] = Unset(), + ) -> NumberVar[float]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[[V1, VarWithDefault[V2], VarWithDefault[V3]], str] + ], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2], Unset] = Unset(), + arg3: Union[V3, Var[V3], Unset] = Unset(), + ) -> StringVar[str]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[[V1, VarWithDefault[V2], VarWithDefault[V3]], SEQUENCE_TYPE] + ], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2], Unset] = Unset(), + arg3: Union[V3, Var[V3], Unset] = Unset(), + ) -> ArrayVar[SEQUENCE_TYPE]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[[V1, VarWithDefault[V2], VarWithDefault[V3]], MAPPING_TYPE] + ], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2], Unset] = Unset(), + arg3: Union[V3, Var[V3], Unset] = Unset(), + ) -> ObjectVar[MAPPING_TYPE]: ... + @overload def call( self: FunctionVar[ @@ -246,12 +724,195 @@ class FunctionVar( arg3: Union[V3, Var[V3], Unset] = Unset(), ) -> Var[R]: ... + @overload + def call( + self: FunctionVar[ + ReflexCallable[ + [V1, VarWithDefault[V2], VarWithDefault[V3], VarWithDefault[V4]], bool + ] + ], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2], Unset] = Unset(), + arg3: Union[V3, Var[V3], Unset] = Unset(), + arg4: Union[V4, Var[V4], Unset] = Unset(), + ) -> BooleanVar: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[ + [V1, VarWithDefault[V2], VarWithDefault[V3], VarWithDefault[V4]], int + ] + ], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2], Unset] = Unset(), + arg3: Union[V3, Var[V3], Unset] = Unset(), + arg4: Union[V4, Var[V4], Unset] = Unset(), + ) -> NumberVar[int]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[ + [V1, VarWithDefault[V2], VarWithDefault[V3], VarWithDefault[V4]], float + ] + ], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2], Unset] = Unset(), + arg3: Union[V3, Var[V3], Unset] = Unset(), + arg4: Union[V4, Var[V4], Unset] = Unset(), + ) -> NumberVar[float]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[ + [V1, VarWithDefault[V2], VarWithDefault[V3], VarWithDefault[V4]], str + ] + ], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2], Unset] = Unset(), + arg3: Union[V3, Var[V3], Unset] = Unset(), + arg4: Union[V4, Var[V4], Unset] = Unset(), + ) -> StringVar[str]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[ + [V1, VarWithDefault[V2], VarWithDefault[V3], VarWithDefault[V4]], + SEQUENCE_TYPE, + ] + ], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2], Unset] = Unset(), + arg3: Union[V3, Var[V3], Unset] = Unset(), + arg4: Union[V4, Var[V4], Unset] = Unset(), + ) -> ArrayVar[SEQUENCE_TYPE]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[ + [V1, VarWithDefault[V2], VarWithDefault[V3], VarWithDefault[V4]], + MAPPING_TYPE, + ] + ], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2], Unset] = Unset(), + arg3: Union[V3, Var[V3], Unset] = Unset(), + arg4: Union[V4, Var[V4], Unset] = Unset(), + ) -> ObjectVar[MAPPING_TYPE]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[ + [V1, VarWithDefault[V2], VarWithDefault[V3], VarWithDefault[V4]], R + ] + ], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2], Unset] = Unset(), + arg3: Union[V3, Var[V3], Unset] = Unset(), + arg4: Union[V4, Var[V4], Unset] = Unset(), + ) -> Var[R]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2], bool]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + ) -> BooleanVar: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2], int]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + ) -> NumberVar[int]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2], float]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + ) -> NumberVar[float]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2], str]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + ) -> StringVar[str]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2], SEQUENCE_TYPE]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + ) -> ArrayVar[SEQUENCE_TYPE]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2], MAPPING_TYPE]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + ) -> ObjectVar[MAPPING_TYPE]: ... + @overload def call( self: FunctionVar[ReflexCallable[[V1, V2], R]], arg1: Union[V1, Var[V1]], arg2: Union[V2, Var[V2]], - ) -> VarOperationCall[[V1, V2], R]: ... + ) -> Var[R]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2, VarWithDefault[V3]], bool]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3], Unset] = Unset(), + ) -> BooleanVar: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2, VarWithDefault[V3]], int]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3], Unset] = Unset(), + ) -> NumberVar[int]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2, VarWithDefault[V3]], float]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3], Unset] = Unset(), + ) -> NumberVar[float]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2, VarWithDefault[V3]], str]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3], Unset] = Unset(), + ) -> StringVar[str]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2, VarWithDefault[V3]], SEQUENCE_TYPE]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3], Unset] = Unset(), + ) -> ArrayVar[SEQUENCE_TYPE]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2, VarWithDefault[V3]], MAPPING_TYPE]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3], Unset] = Unset(), + ) -> ObjectVar[MAPPING_TYPE]: ... @overload def call( @@ -261,6 +922,135 @@ class FunctionVar( arg3: Union[V3, Var[V3], Unset] = Unset(), ) -> Var[R]: ... + @overload + def call( + self: FunctionVar[ + ReflexCallable[[V1, V2, VarWithDefault[V3], VarWithDefault[V4]], bool] + ], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3], Unset] = Unset(), + arg4: Union[V4, Var[V4], Unset] = Unset(), + ) -> BooleanVar: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[[V1, V2, VarWithDefault[V3], VarWithDefault[V4]], int] + ], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3], Unset] = Unset(), + arg4: Union[V4, Var[V4], Unset] = Unset(), + ) -> NumberVar[int]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[[V1, V2, VarWithDefault[V3], VarWithDefault[V4]], float] + ], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3], Unset] = Unset(), + arg4: Union[V4, Var[V4], Unset] = Unset(), + ) -> NumberVar[float]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[[V1, V2, VarWithDefault[V3], VarWithDefault[V4]], str] + ], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3], Unset] = Unset(), + arg4: Union[V4, Var[V4], Unset] = Unset(), + ) -> StringVar[str]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[ + [V1, V2, VarWithDefault[V3], VarWithDefault[V4]], SEQUENCE_TYPE + ] + ], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3], Unset] = Unset(), + arg4: Union[V4, Var[V4], Unset] = Unset(), + ) -> ArrayVar[SEQUENCE_TYPE]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[ + [V1, V2, VarWithDefault[V3], VarWithDefault[V4]], MAPPING_TYPE + ] + ], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3], Unset] = Unset(), + arg4: Union[V4, Var[V4], Unset] = Unset(), + ) -> ObjectVar[MAPPING_TYPE]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[[V1, V2, VarWithDefault[V3], VarWithDefault[V4]], R] + ], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3], Unset] = Unset(), + arg4: Union[V4, Var[V4], Unset] = Unset(), + ) -> Var[R]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2, V3], bool]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3]], + ) -> BooleanVar: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2, V3], int]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3]], + ) -> NumberVar[int]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2, V3], float]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3]], + ) -> NumberVar[float]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2, V3], str]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3]], + ) -> StringVar[str]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2, V3], SEQUENCE_TYPE]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3]], + ) -> ArrayVar[SEQUENCE_TYPE]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2, V3], MAPPING_TYPE]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3]], + ) -> ObjectVar[MAPPING_TYPE]: ... + @overload def call( self: FunctionVar[ReflexCallable[[V1, V2, V3], R]], @@ -269,6 +1059,127 @@ class FunctionVar( arg3: Union[V3, Var[V3]], ) -> Var[R]: ... + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2, V3, VarWithDefault[V4]], bool]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3]], + arg4: Union[V4, Var[V4], Unset] = Unset(), + ) -> BooleanVar: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2, V3, VarWithDefault[V4]], int]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3]], + arg4: Union[V4, Var[V4], Unset] = Unset(), + ) -> NumberVar[int]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2, V3, VarWithDefault[V4]], float]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3]], + arg4: Union[V4, Var[V4], Unset] = Unset(), + ) -> NumberVar[float]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2, V3, VarWithDefault[V4]], str]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3]], + arg4: Union[V4, Var[V4], Unset] = Unset(), + ) -> StringVar[str]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[[V1, V2, V3, VarWithDefault[V4]], SEQUENCE_TYPE] + ], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3]], + arg4: Union[V4, Var[V4], Unset] = Unset(), + ) -> ArrayVar[SEQUENCE_TYPE]: ... + + @overload + def call( + self: FunctionVar[ + ReflexCallable[[V1, V2, V3, VarWithDefault[V4]], MAPPING_TYPE] + ], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3]], + arg4: Union[V4, Var[V4], Unset] = Unset(), + ) -> ObjectVar[MAPPING_TYPE]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2, V3, VarWithDefault[V4]], R]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3]], + arg4: Union[V4, Var[V4], Unset] = Unset(), + ) -> Var[R]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2, V3, V4], bool]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3]], + arg4: Union[V4, Var[V4]], + ) -> BooleanVar: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2, V3, V4], int]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3]], + arg4: Union[V4, Var[V4]], + ) -> NumberVar[int]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2, V3, V4], float]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3]], + arg4: Union[V4, Var[V4]], + ) -> NumberVar[float]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2, V3, V4], str]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3]], + arg4: Union[V4, Var[V4]], + ) -> StringVar[str]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2, V3, V4], SEQUENCE_TYPE]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3]], + arg4: Union[V4, Var[V4]], + ) -> ArrayVar[SEQUENCE_TYPE]: ... + + @overload + def call( + self: FunctionVar[ReflexCallable[[V1, V2, V3, V4], MAPPING_TYPE]], + arg1: Union[V1, Var[V1]], + arg2: Union[V2, Var[V2]], + arg3: Union[V3, Var[V3]], + arg4: Union[V4, Var[V4]], + ) -> ObjectVar[MAPPING_TYPE]: ... + @overload def call( self: FunctionVar[ReflexCallable[[V1, V2, V3, V4], R]], @@ -278,27 +1189,6 @@ class FunctionVar( arg4: Union[V4, Var[V4]], ) -> Var[R]: ... - @overload - def call( - self: FunctionVar[ReflexCallable[[V1, V2, V3, V4, V5], R]], - arg1: Union[V1, Var[V1]], - arg2: Union[V2, Var[V2]], - arg3: Union[V3, Var[V3]], - arg4: Union[V4, Var[V4]], - arg5: Union[V5, Var[V5]], - ) -> Var[R]: ... - - @overload - def call( - self: FunctionVar[ReflexCallable[[V1, V2, V3, V4, V5, V6], R]], - arg1: Union[V1, Var[V1]], - arg2: Union[V2, Var[V2]], - arg3: Union[V3, Var[V3]], - arg4: Union[V4, Var[V4]], - arg5: Union[V5, Var[V5]], - arg6: Union[V6, Var[V6]], - ) -> Var[R]: ... - # Capture Any to allow for arbitrary number of arguments @overload def call(self: FunctionVar[NoReturn], *args: Var | Any) -> Var: ... @@ -866,3 +1756,59 @@ else: "((__to_string) => __to_string.toString())", _var_type=ReflexCallable[Any, str], ) + + +def _generate_overloads_for_function_var_call(maximum_args: int = 4) -> str: + """Generate overloads for the function var call method. + + Args: + maximum_args: The maximum number of arguments to generate overloads for. + + Returns: + The generated overloads. + """ + overloads = [] + return_type_mapping = { + "bool": "BooleanVar", + "int": "NumberVar[int]", + "float": "NumberVar[float]", + "str": "StringVar[str]", + "SEQUENCE_TYPE": "ArrayVar[SEQUENCE_TYPE]", + "MAPPING_TYPE": "ObjectVar[MAPPING_TYPE]", + "R": "Var[R]", + } + for number_of_required_args in range(maximum_args + 1): + for number_of_optional_args in range( + maximum_args + 1 - number_of_required_args + ): + for return_type, return_type_var in return_type_mapping.items(): + required_args = [ + f"arg{j + 1}: Union[V" f"{j + 1}, Var[V{j + 1}]]" + for j in range(number_of_required_args) + ] + optional_args = [ + f"arg{j + 1}: Union[V" f"{j + 1}, Var[V{j + 1}], Unset] = Unset()" + for j in range( + number_of_required_args, + number_of_required_args + number_of_optional_args, + ) + ] + required_params = [f"V{j + 1}" for j in range(number_of_required_args)] + optional_params = [ + f"VarWithDefault[V{j + 1}]" + for j in range( + number_of_required_args, + number_of_required_args + number_of_optional_args, + ) + ] + function_type_hint = f"""FunctionVar[ReflexCallable[[{", ".join(required_params + optional_params)}], {return_type}]]""" + overloads.append( + f""" + @overload + def call( + self: {function_type_hint}, + {",\n ".join(required_args + optional_args)} + ) -> {return_type_var}: ... + """ + ) + return "\n".join(overloads)