package org.jtwig.util.builder;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableMap;
import org.apache.commons.lang3.builder.Builder;
import org.jtwig.environment.and.AndBuilder;
import java.util.HashMap;
import java.util.Map;
public class MapBuilder<B, K, V> implements Builder<Map<K, V>>, AndBuilder<B> {
private final B parentBuilder;
private Map<K, V> value = new HashMap<>();
public MapBuilder(B parentBuilder) {
this.parentBuilder = parentBuilder;
}
public MapBuilder(B parentBuilder, Map<K, V> values) {
this.parentBuilder = parentBuilder;
this.value = new HashMap<>(values);
}
public MapBuilder<B, K, V> add (K key, V value) {
this.value.put(key, value);
return this;
}
public MapBuilder<B, K, V> add (Map<K, V> values) {
this.value.putAll(values);
return this;
}
public MapBuilder<B, K, V> set (Map<K, V> values) {
this.value = new HashMap<>(values);
return this;
}
public MapBuilder<B, K, V> filter (Predicate<Map.Entry<K, V>> predicate) {
Map<K, V> newValue = new HashMap<>();
for (Map.Entry<K, V> entry : this.value.entrySet()) {
if (predicate.apply(entry)) {
newValue.put(entry.getKey(), entry.getValue());
}
}
this.value = newValue;
return this;
}
@Override
public Map<K, V> build() {
return ImmutableMap.copyOf(this.value);
}
@Override
public B and() {
return parentBuilder;
}
}