from dataclasses import dataclass from typing import Any, Callable, Mapping, TypeAlias from .float import ( FLOAT_UNARY_OPERATIONS, FLOAT_UNARY_CONDITIONS, FLOAT_BINARY_OPERATIONS, FLOAT_BINARY_CONDITIONS, ) DEFAULT_NUMBER = ("NUMBER", {"default": 0.0}) number: TypeAlias = int | float class NumberUnaryOperation: @classmethod def INPUT_TYPES(cls) -> Mapping[str, Any]: return { "required": { "op": (list(FLOAT_UNARY_OPERATIONS.keys()),), "a": DEFAULT_NUMBER, } } RETURN_TYPES = ("NUMBER",) FUNCTION = "op" CATEGORY = "math/number" def op(self, op: str, a: number) -> tuple[float]: return (FLOAT_UNARY_OPERATIONS[op](float(a)),) class NumberUnaryCondition: @classmethod def INPUT_TYPES(cls) -> Mapping[str, Any]: return { "required": { "op": (list(FLOAT_UNARY_CONDITIONS.keys()),), "a": DEFAULT_NUMBER, } } RETURN_TYPES = ("BOOL",) FUNCTION = "op" CATEGORY = "math/number" def op(self, op: str, a: number) -> tuple[bool]: return (FLOAT_UNARY_CONDITIONS[op](float(a)),) class NumberBinaryOperation: @classmethod def INPUT_TYPES(cls) -> Mapping[str, Any]: return { "required": { "op": (list(FLOAT_BINARY_OPERATIONS.keys()),), "a": DEFAULT_NUMBER, "b": DEFAULT_NUMBER, } } RETURN_TYPES = ("NUMBER",) FUNCTION = "op" CATEGORY = "math/number" def op(self, op: str, a: number, b: number) -> tuple[float]: return (FLOAT_BINARY_OPERATIONS[op](float(a), float(b)),) class NumberBinaryCondition: @classmethod def INPUT_TYPES(cls) -> Mapping[str, Any]: return { "required": { "op": (list(FLOAT_BINARY_CONDITIONS.keys()),), "a": DEFAULT_NUMBER, "b": DEFAULT_NUMBER, } } RETURN_TYPES = ("BOOL",) FUNCTION = "op" CATEGORY = "math/float" def op(self, op: str, a: number, b: number) -> tuple[bool]: return (FLOAT_BINARY_CONDITIONS[op](float(a), float(b)),) NODE_CLASS_MAPPINGS = { "CM_NumberUnaryOperation": NumberUnaryOperation, "CM_NumberUnaryCondition": NumberUnaryCondition, "CM_NumberBinaryOperation": NumberBinaryOperation, "CM_NumberBinaryCondition": NumberBinaryCondition, }