package io.gitlab.jfronny.muscript.libs; import io.gitlab.jfronny.muscript.compiler.MuScriptVersion; import io.gitlab.jfronny.muscript.compiler.Parser; import io.gitlab.jfronny.muscript.compiler.SourceFS; import io.gitlab.jfronny.muscript.data.Script; import java.util.HashMap; import java.util.Map; import java.util.Objects; public interface IOWrapper { String readString(String path); Script parseScript(String path); class Caching implements IOWrapper { private final Map cachedStrings = new HashMap<>(); private final Map cachedScripts = new HashMap<>(); private final IOWrapper inner; public Caching(IOWrapper inner) { this.inner = Objects.requireNonNull(inner); } @Override public String readString(String path) { return cachedStrings.computeIfAbsent(path, inner::readString); } @Override public Script parseScript(String path) { return cachedScripts.computeIfAbsent(path, inner::parseScript); } } class SourceFSWrapper implements IOWrapper { private final SourceFS inner; private final MuScriptVersion version; public SourceFSWrapper(MuScriptVersion version, SourceFS inner) { this.inner = Objects.requireNonNull(inner); this.version = Objects.requireNonNull(version); } @Override public String readString(String path) { return inner.read(path); } @Override public Script parseScript(String path) { return Parser.parseMultiScript(version, path, inner); } } }