Index: src/AST/Node.hpp
===================================================================
--- src/AST/Node.hpp	(revision 05d55ffed10db511d8a2eec6a4ec6ccfbd8079dd)
+++ src/AST/Node.hpp	(revision 2d11663e05da9b5f76704ffe64a5b46d0ec78c1a)
@@ -99,14 +99,26 @@
 
 /// Mutate a node field (only clones if not equal to existing value)
-template<typename node_t, typename field_t>
-const node_t * mutate_field( 
-	const node_t * node, 
-	typename std::remove_const<typename std::remove_reference<field_t>::type>::type node_t::* field,
-	field_t&& val 
-) {
+template<typename node_t, typename field_t, typename assn_t>
+const node_t * mutate_field( const node_t * node, field_t node_t::* field, assn_t && val ) {
+	// skip mutate if equivalent
 	if ( node->*field == val ) return node;
 	
+	// mutate and return
 	node_t * ret = mutate( node );
-	ret->*field = std::forward< field_t >( val );
+	ret->*field = std::forward< assn_t >( val );
+	return ret;
+}
+
+/// Mutate a single index of a node field (only clones if not equal to existing value)
+template<typename node_t, typename coll_t, typename ind_t, typename field_t>
+const node_t * mutate_field_index(
+	const node_t * node, coll_t node_t::* field, ind_t i, field_t && val
+) {
+	// skip mutate if equivalent
+	if  ( (node->*field)[i] == val ) return node;
+
+	// mutate and return
+	node_t * ret = mutate( node );
+	(ret->*field)[i] = std::forward< field_t >( val );
 	return ret;
 }
