package bjc.utils.funcdata; import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Function; /** * A map that transforms values from one type to another * * @author ben * * @param * The type of the map's keys * @param * The type of the map's values * @param * The type of the transformed values */ final class TransformedValueMap implements IMap { private IMap mapToTransform; private Function transformer; public TransformedValueMap(IMap destMap, Function transform) { mapToTransform = destMap; transformer = transform; } @Override public boolean containsKey(OldKey key) { return mapToTransform.containsKey(key); } @Override public IMap extend() { return new ExtendedMap<>(this, new FunctionalMap<>()); } @Override public void forEach(BiConsumer action) { mapToTransform.forEach((key, val) -> { action.accept(key, transformer.apply(val)); }); } @Override public void forEachKey(Consumer action) { mapToTransform.forEachKey(action); } @Override public void forEachValue(Consumer action) { mapToTransform.forEachValue((val) -> { action.accept(transformer.apply(val)); }); } @Override public NewValue get(OldKey key) { return transformer.apply(mapToTransform.get(key)); } @Override public int getSize() { return mapToTransform.getSize(); } @Override public IList keyList() { return mapToTransform.keyList(); } @Override public IMap mapValues( Function transform) { return new TransformedValueMap<>(this, transform); } @Override public NewValue put(OldKey key, NewValue val) { throw new UnsupportedOperationException( "Can't add items to transformed map"); } @Override public NewValue remove(OldKey key) { return transformer.apply(mapToTransform.remove(key)); } @Override public String toString() { return mapToTransform.toString(); } @Override public IList valueList() { return mapToTransform.valueList().map(transformer); } }