ExprPtr with(const Assign* v) const { // hack to assign [char] into <std.string> if (hasConstraint(this->constraint, v->type())) { if (*v->left()->type()->monoType() == *stdstrty && *v->right()->type()->monoType() == *chararrty) { static MonoTypePtr assignty = functy(list(stdstrty, chararrty), unitty); return fncall(var("stdstringAssign", assignty, v->left()->la()), list(switchOf(v->left(), *this), switchOf(v->right(), *this)), v->la()); } } return wrapWithTy(v->type(), new Assign(switchOf(v->left(), *this), switchOf(v->right(), *this), v->la())); }
std::vector<T> switchOf(const Types& ts, const switchType<T>& f) { std::vector<T> result; for (Types::const_iterator t = ts.begin(); t != ts.end(); ++t) { result.push_back(switchOf(*t, f)); } return result; }
ExprPtr HFRecordEliminator::unqualify(const TEnvPtr&, const ConstraintPtr& cst, const ExprPtr& e, Definitions*) const { return switchOf(e, HFRecordUnqualify(cst)); }
template <typename T> T switchOf(const TypePtr& t, const switchType<T>& f) { return switchOf(*t, f); }