package dev.peerat.parser.java; import java.util.List; import java.util.function.Function; import dev.peerat.parser.Token; public class Value extends JavaElement{ private Token token; private JavaElement content; Value(){} public Value(Token token){ this.token = token; } public Value(JavaElement content){ this.content = content; } public Token getToken(){ return this.token; } public JavaElement getContent(){ return this.content; } @Override public String toString(){ return "Value[token="+token+", content="+content+"]"; } @Override public void build(Builder builder) throws Exception{ if(token != null){ builder.append(token); }else{ content.build(builder); } } @Override public E find(Function finder){ return content != null ? finder.apply(content) ? (E) content : null : null; } @Override public void findAll(Function finder, List list) { if(content != null){ if(finder.apply(content)) list.add((E) content); content.findAll(finder, list); } } public static class BiValue extends Value{ private Value left; private String action; private Value right; public BiValue(Value left, String action, Value right){ this.left = left; this.action = action; this.right = right; } public Value left(){ return left; } public String getAction(){ return this.action; } public Value right(){ return right; } @Override public String toString(){ return left+" "+action+" "+right; } @Override public void build(Builder builder) throws Exception{ left.build(builder); builder.append(action); right.build(builder); } @Override public E find(Function finder){ return finder.apply(left) ? (E) left : finder.apply(right) ? (E) right : null; } @Override public void findAll(Function finder, List list){ if(finder.apply(left)) list.add((E)left); left.findAll(finder, list); if(finder.apply(right)) list.add((E)right); right.findAll(finder, list); } } public static class TriValue extends Value{ private Value check; private Value success; private Value fail; public TriValue(){} public Value getChecker(){ return check; } public Value success(){ return success; } public Value fail(){ return fail; } @Override public void build(Builder builder) throws Exception { check.build(builder); builder.append("?"); success.build(builder); builder.append(":"); fail.build(builder); } @Override public E find(Function finder){ return finder.apply(check) ? (E) check : finder.apply(success) ? (E) success : finder.apply(fail) ? (E) fail : null; } @Override public void findAll(Function finder, List list){ if(finder.apply(check)) list.add((E)check); check.findAll(finder, list); if(finder.apply(success)) list.add((E)success); success.findAll(finder, list); if(finder.apply(fail)) list.add((E)fail); fail.findAll(finder, list); } } public static class MethodCallValue extends Value{ private Token token; private List parameters; public MethodCallValue(Token token, List parameters){ this.token = token; this.parameters = parameters; } public Token getToken(){ return token; } public List getParameters(){ return this.parameters; } @Override public String toString(){ return token.getValue()+((parameters == null ? "":parameters)); } @Override public void build(Builder builder) throws Exception{ builder.append(token); } @Override public E find(Function finder){ if(parameters != null){ for(Value value : parameters){ if(finder.apply(value)) return (E) value; } } return null; } @Override public void findAll(Function finder, List list){ if(parameters != null){ for(Value value : parameters){ if(finder.apply(value)) list.add((E) value); value.findAll(finder, list); } } } } public static class InstanceValue extends Value{ private Token newer; private Token token; private List parameters; public InstanceValue(Token newer, Token token, List parameters){ this.newer = newer; this.token = token; this.parameters = parameters; } public Token getNewer(){ return this.newer; } public Token getToken(){ return token; } public List getParameters(){ return this.parameters; } @Override public String toString(){ return newer.getValue()+" "+token.getValue()+((parameters == null ? "":parameters)); } @Override public void build(Builder builder) throws Exception{ builder.append(newer); builder.append(token); } @Override public E find(Function finder){ if(parameters != null){ for(Value value : parameters){ if(finder.apply(value)) return (E) value; } } return null; } @Override public void findAll(Function finder, List list){ if(parameters != null){ for(Value value : parameters){ if(finder.apply(value)) list.add((E) value); value.findAll(finder, list); } } } } //TO FILL public static class LambdaValue extends Value{ private List parameters; private List operations; public LambdaValue(List parameters, List operations){ this.parameters = parameters; this.operations = operations; } public List getParameters(){ return this.parameters; } public List getOperations(){ return this.operations; } @Override public String toString(){ return "() -> {}"; } @Override public void build(Builder builder) throws Exception{ } @Override public E find(Function finder){ return null; } @Override public void findAll(Function finder, List list){ } } }