package com.cardshifter.modapi.attributes;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Stream;
import com.cardshifter.modapi.base.Component;
import com.cardshifter.modapi.base.CopyableComponent;
import com.cardshifter.modapi.base.Entity;
public class ECSAttributeMap extends Component implements CopyableComponent {
private final Map<ECSAttribute, ECSAttributeData> map = new HashMap<>();
private ECSAttributeMap() {
}
public ECSAttributeMap set(ECSAttribute attr, String value) {
ECSAttributeData data = getAttribute(attr);
data.set(value);
return this;
}
public Optional<ECSAttributeData> get(ECSAttribute res) {
return Optional.ofNullable(map.get(res));
}
public ECSAttributeData getAttribute(ECSAttribute attr) {
map.computeIfAbsent(attr, r -> new ECSAttributeData(getEntity(), r));
return map.get(attr);
}
public static ECSAttributeMap createFor(Entity entity) {
ECSAttributeMap attr = new ECSAttributeMap();
entity.addComponent(attr);
return attr;
}
public static ECSAttributeMap createOrGetFor(Entity entity) {
ECSAttributeMap attr = entity.getComponent(ECSAttributeMap.class);
if (attr == null) {
attr = new ECSAttributeMap();
entity.addComponent(attr);
}
return attr;
}
@Override
public String toString() {
return map.toString();
}
public Stream<ECSAttributeData> getAttributes() {
return map.values().stream();
}
@Override
public Component copy(Entity copyTo) {
ECSAttributeMap copy = new ECSAttributeMap();
for (ECSAttributeData data : map.values()) {
ECSAttributeData copyData = data.copy(copyTo);
copy.map.put(data.getAttribute(), copyData);
}
return copy;
}
}