
one.xingyi.profile.pathmap.IPathMap Maven / Gradle / Ivy
package one.xingyi.profile.pathmap;
import lombok.AllArgsConstructor;
import one.xingyi.helpers.MapHelpers;
import one.xingyi.interfaces.Function3;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Supplier;
public interface IPathMap {
static IPathMap make(Supplier defaultValue) {return new PathMap<>("", defaultValue, defaultValue.get());}
String path();
V get();
void put(V value);
IPathMap child(String pathOffset);
Set childPaths();
Acc fold(Acc zero, Function3 foldFn);
}
@AllArgsConstructor
class PathMap implements IPathMap {
final String path;
final Supplier defaultValue;
V value;
final Map> children = new ConcurrentHashMap<>();
@Override
public String path() {return path;}
@Override
public void put(V value) {this.value = value;}
@Override
public V get() {return value;}
@Override
public IPathMap child(String pathOffset) {return MapHelpers.getOrAdd(children, pathOffset, () -> new PathMap<>(path + (path.isEmpty() ? "" : ".") + pathOffset, defaultValue, defaultValue.get()));}
@Override
public Set childPaths() {return children.keySet();}
@Override
public Acc fold(Acc zero, Function3 foldFn) {
Acc acc = foldFn.apply(zero, path, value);
SortedSet keys = new TreeSet<>(children.keySet());
for (String key : keys)
acc = children.get(key).fold(acc, foldFn);
return acc;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy