package mage.utils;
import java.util.ArrayList;
import java.util.function.Consumer;
import java.util.function.Supplier;
/**
* A base class for fluent, immutable, composable builders.
*
* @see Builder
*/
public abstract class FluentBuilder> {
final ArrayList> buildSequence;
private final Supplier newReference;
protected FluentBuilder(Supplier newReference) {
this.buildSequence = new ArrayList<>();
this.newReference = newReference;
}
private RealBuilder copy() {
final RealBuilder realBuilder = newReference.get();
realBuilder.buildSequence.addAll(buildSequence);
return realBuilder;
}
protected abstract ToBuild makeValue();
public RealBuilder with(Consumer consumer) {
final RealBuilder nextBuilder = this.copy();
nextBuilder.buildSequence.add(consumer);
return nextBuilder;
}
public ToBuild build() {
final RealBuilder instance = this.copy();
instance.buildSequence.forEach(c -> c.accept(instance));
return instance.makeValue();
}
}