package org.smoothbuild.lang.value;
import static org.smoothbuild.lang.value.Array.storeArrayInDb;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import org.smoothbuild.db.hashed.HashedDb;
import org.smoothbuild.lang.type.ArrayType;
import com.google.common.hash.HashCode;
public class ArrayBuilder<T extends Value> {
private final ArrayType type;
private final Function<HashCode, T> elementMarshaller;
private final HashedDb hashedDb;
private final List<T> elements;
public ArrayBuilder(ArrayType type, Function<HashCode, T> elementMarshaller, HashedDb hashedDb) {
this.type = type;
this.elementMarshaller = elementMarshaller;
this.hashedDb = hashedDb;
this.elements = new ArrayList<>();
}
public ArrayBuilder<T> add(T elem) {
Class<?> required = type.elemType().jType().getRawType();
if (!required.isAssignableFrom(elem.getClass())) {
throw new IllegalArgumentException("Element must be of type " + required.getCanonicalName());
}
elements.add(elem);
return this;
}
public Array<T> build() {
return storeArrayInDb(elements, type, elementMarshaller, hashedDb);
}
}