All Downloads are FREE. Search and download functionalities are using the official Maven repository.

one.xingyi.profile.pathmap.IPathMap Maven / Gradle / Ivy

There is a newer version: 1.5.9
Show newest version
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