from typing import Any, Callable, Mapping DEFAULT_BOOL = ("BOOL", {"default": False}) BOOL_UNARY_OPERATIONS: Mapping[str, Callable[[bool], bool]] = { "Not": lambda a: not a, } BOOL_BINARY_OPERATIONS: Mapping[str, Callable[[bool, bool], bool]] = { "Nor": lambda a, b: not (a or b), "Xor": lambda a, b: a ^ b, "Nand": lambda a, b: not (a and b), "And": lambda a, b: a and b, "Xnor": lambda a, b: not (a ^ b), "Or": lambda a, b: a or b, "Eq": lambda a, b: a == b, "Neq": lambda a, b: a != b, } class BoolUnaryOperation: @classmethod def INPUT_TYPES(cls) -> Mapping[str, Any]: return { "required": {"op": (list(BOOL_UNARY_OPERATIONS.keys()),), "a": DEFAULT_BOOL} } RETURN_TYPES = ("BOOL",) FUNCTION = "op" CATEGORY = "math/bool" def op(self, op: str, a: bool) -> tuple[bool]: return (BOOL_UNARY_OPERATIONS[op](a),) class BoolBinaryOperation: @classmethod def INPUT_TYPES(cls) -> Mapping[str, Any]: return { "required": { "op": (list(BOOL_BINARY_OPERATIONS.keys()),), "a": DEFAULT_BOOL, "b": DEFAULT_BOOL, } } RETURN_TYPES = ("BOOL",) FUNCTION = "op" CATEGORY = "math/bool" def op(self, op: str, a: bool, b: bool) -> tuple[bool]: return (BOOL_BINARY_OPERATIONS[op](a, b),) NODE_CLASS_MAPPINGS = { "CM_BoolUnaryOperation": BoolUnaryOperation, "CM_BoolBinaryOperation": BoolBinaryOperation, }