#pragma once #include "PrimitivesRegistry.h" #include "ast/Expression.h" #include "ast/Statement.h" #include "ast/Function.h" #include "ast/Module.h" #include #include #include #include #include struct CompositionStep { std::string symbol; std::string inputType; std::string outputType; }; struct CompositionState { std::vector steps; std::string inputType; std::string outputType; }; static inline std::string inferTypeHint(const std::string& name) { std::string lower = name; std::transform(lower.begin(), lower.end(), lower.begin(), [](unsigned char c) { return (char)std::tolower(c); }); if (lower.find("string") != std::string::npos || lower.find("str") != std::string::npos) return "string"; if (lower.find("json") != std::string::npos) return "json"; if (lower.find("list") != std::string::npos || lower.find("array") != std::string::npos) return "list"; if (lower.find("map") != std::string::npos || lower.find("dict") != std::string::npos) return "map"; if (lower.find("int") != std::string::npos || lower.find("count") != std::string::npos) return "int"; return "any"; } static inline std::vector suggestCompositionSteps( const std::vector& primitives, const std::string& desiredInput, const std::string& desiredOutput) { std::vector out; for (const auto& prim : primitives) { if (prim.kind != "function") continue; CompositionStep step; step.symbol = prim.name; step.inputType = desiredInput.empty() ? inferTypeHint(prim.name) : desiredInput; step.outputType = desiredOutput.empty() ? inferTypeHint(prim.name) : desiredOutput; out.push_back(step); } return out; } static inline std::string buildCompositionCode(const std::vector& steps, const std::string& inputVar) { if (steps.empty()) return ""; std::string expr = inputVar; for (const auto& step : steps) { expr = step.symbol + "(" + expr + ")"; } return expr; } static inline std::string buildCompositionFunction(const std::vector& steps, const std::string& functionName, const std::string& inputVar) { std::string expr = buildCompositionCode(steps, inputVar); if (expr.empty()) return ""; std::ostringstream ss; ss << "def " << functionName << "(" << inputVar << "):\n"; ss << " return " << expr << "\n"; return ss.str(); }