// Path: src/main/java/com/shapesecurity/shift/es2017/semantics/asg/BreakTarget.java
// public class BreakTarget implements Node { // no-op. target of a break.
// 
// 	public BreakTarget() {
// 	}
// 
// 	@Override
// 	public boolean equalsIgnoringChildren(@Nonnull Node node) {
// 		return node == this;
// 	}
// }
// 
// Path: src/main/java/com/shapesecurity/shift/es2017/semantics/asg/NodeWithValue.java
// public interface NodeWithValue extends Node {
// }


import com.shapesecurity.shift.es2017.semantics.asg.BreakTarget;
import com.shapesecurity.shift.es2017.semantics.asg.NodeWithValue;
import java.util.function.Function;
package com.shapesecurity.shift.es2017.semantics.visitor;



public abstract class CompletionRecord {

	// modelling ReturnIfAbrupt
	public abstract <T extends NodeWithValue> CompletionRecord mapNormal(Function<? super NodeWithValue, T> f);

	public static class Normal extends CompletionRecord {
		public final NodeWithValue value;

		Normal(NodeWithValue value) {
			this.value = value;
		}

		@Override
		public <T extends NodeWithValue> Normal mapNormal(Function<? super NodeWithValue, T> f) {
			return new Normal(f.apply(this.value));
		}
	}

	public static class Break extends CompletionRecord {
// Path: src/main/java/com/shapesecurity/shift/es2017/semantics/asg/BreakTarget.java
// public class BreakTarget implements Node { // no-op. target of a break.
// 
// 	public BreakTarget() {
// 	}
// 
// 	@Override
// 	public boolean equalsIgnoringChildren(@Nonnull Node node) {
// 		return node == this;
// 	}
// }
// 
// Path: src/main/java/com/shapesecurity/shift/es2017/semantics/asg/NodeWithValue.java
// public interface NodeWithValue extends Node {
// }


// Path: src/main/java/com/shapesecurity/shift/es2017/semantics/visitor/CompletionRecord.java
import com.shapesecurity.shift.es2017.semantics.asg.BreakTarget;
import com.shapesecurity.shift.es2017.semantics.asg.NodeWithValue;
import java.util.function.Function;

package com.shapesecurity.shift.es2017.semantics.visitor;



public abstract class CompletionRecord {

	// modelling ReturnIfAbrupt
	public abstract <T extends NodeWithValue> CompletionRecord mapNormal(Function<? super NodeWithValue, T> f);

	public static class Normal extends CompletionRecord {
		public final NodeWithValue value;

		Normal(NodeWithValue value) {
			this.value = value;
		}

		@Override
		public <T extends NodeWithValue> Normal mapNormal(Function<? super NodeWithValue, T> f) {
			return new Normal(f.apply(this.value));
		}
	}

	public static class Break extends CompletionRecord {
		public final BreakTarget target;