// Path: src/com/infdot/analysis/solver/DataflowExpression.java
// public interface DataflowExpression<V> {
// 	/**
// 	 * Evaluates expression using the given variable values.
// 	 */
// 	V eval(V[] values);
// 	
// 	/**
// 	 * Helper to collect all variables,
// 	 */
// 	void collectVariables(Set<Integer> variables);
// }
// 
// Path: src/com/infdot/analysis/util/Transform.java
// public interface Transform<T1, T2> {
// 	T2 apply(T1 o);
// }


import java.util.Map;
import java.util.Set;
import com.infdot.analysis.solver.DataflowExpression;
import com.infdot.analysis.util.Transform;
package com.infdot.analysis.solver.lattice.map;



/**
 * Implements map modification where value depends
 * on dataflow variable values.
 * 
 * @author Raivo Laanemets
 */
public class ModifyWithEvalOperation<K, V> implements DataflowExpression<Map<K, V>> {
	private DataflowExpression<Map<K, V>> map;
	private K key;
// Path: src/com/infdot/analysis/solver/DataflowExpression.java
// public interface DataflowExpression<V> {
// 	/**
// 	 * Evaluates expression using the given variable values.
// 	 */
// 	V eval(V[] values);
// 	
// 	/**
// 	 * Helper to collect all variables,
// 	 */
// 	void collectVariables(Set<Integer> variables);
// }
// 
// Path: src/com/infdot/analysis/util/Transform.java
// public interface Transform<T1, T2> {
// 	T2 apply(T1 o);
// }


// Path: src/com/infdot/analysis/solver/lattice/map/ModifyWithEvalOperation.java
import java.util.Map;
import java.util.Set;
import com.infdot.analysis.solver.DataflowExpression;
import com.infdot.analysis.util.Transform;

package com.infdot.analysis.solver.lattice.map;



/**
 * Implements map modification where value depends
 * on dataflow variable values.
 * 
 * @author Raivo Laanemets
 */
public class ModifyWithEvalOperation<K, V> implements DataflowExpression<Map<K, V>> {
	private DataflowExpression<Map<K, V>> map;
	private K key;
	private Transform<Map<K, V>, V> exp;