|
|
|
@@ -41,8 +41,11 @@ using RefInputs = OrderedMap<AnfNodePtr, std::vector<size_t>>; |
|
|
|
// Add or get a monad parameter. |
|
|
|
AnfNodePtr AddMonadParameter(const FuncGraphPtr &func_graph, const std::string &name, |
|
|
|
const abstract::AbstractBasePtr &abs) { |
|
|
|
size_t params_size = func_graph->parameters().size(); |
|
|
|
size_t io_monad_location = params_size; |
|
|
|
// Search for existed parameters, return it if found. |
|
|
|
for (auto &node : func_graph->parameters()) { |
|
|
|
for (size_t i = 0; i < params_size; i++) { |
|
|
|
auto &node = func_graph->parameters()[i]; |
|
|
|
auto para = dyn_cast<Parameter>(node); |
|
|
|
if (para == nullptr) { |
|
|
|
continue; |
|
|
|
@@ -51,13 +54,23 @@ AnfNodePtr AddMonadParameter(const FuncGraphPtr &func_graph, const std::string & |
|
|
|
if (para_abs && *para_abs == *abs) { |
|
|
|
return para; |
|
|
|
} |
|
|
|
if (HasAbstractIOMonad(para)) { |
|
|
|
io_monad_location = i; |
|
|
|
} |
|
|
|
} |
|
|
|
// Create a new parameter if not existed. |
|
|
|
auto para = std::make_shared<Parameter>(func_graph); |
|
|
|
para->set_name(name); |
|
|
|
para->debug_info()->set_name(name); |
|
|
|
para->set_abstract(abs); |
|
|
|
func_graph->add_parameter(para); |
|
|
|
// If io monad parameter added before u monad parameter, should insert u monad before io monad in parameters |
|
|
|
if (io_monad_location != params_size && abs->isa<abstract::AbstractUMonad>()) { |
|
|
|
std::vector<AnfNodePtr> params = func_graph->parameters(); |
|
|
|
params.insert(params.begin() + io_monad_location, para); |
|
|
|
func_graph->set_parameters(params); |
|
|
|
} else { |
|
|
|
func_graph->add_parameter(para); |
|
|
|
} |
|
|
|
return para; |
|
|
|
} |
|
|
|
|
|
|
|
|