package be.jeffcheasey88.peeratcode.parser.state; import java.util.ArrayList; import java.util.List; import java.util.function.BiFunction; import java.util.function.Function; import be.jeffcheasey88.peeratcode.parser.Token; import be.jeffcheasey88.peeratcode.parser.TokenValidator; import be.jeffcheasey88.peeratcode.parser.Tokenizer; public class StateTree{ private List> childs; Function checker; private BuilderStateTree builder; public StateTree(){ this.childs = new ArrayList<>(); } public void seed(Tokenizer tokenizer, E container){ TokenValidator validator = new TokenValidator(tokenizer.getTokens().toArray(new Token[0])); while(validator.hasNext()) { System.out.println("seed"); E build = internalSeed(validator, container); if(build == null) break; } } B internalSeed(TokenValidator validator, E element){ for(StateTree child : this.childs){ TokenValidator branch = validator.branch(); if(child.checker == null){ E builded = child.internalSeed(branch, element); if(builded != null){ validator.merge(branch); return (B) builded; } continue; } if(child.checker.apply(branch)){ E builded = child.internalSeed(branch, element); if(builded != null){ validator.merge(branch); return (B) builded; } } } if(this.builder != null) return (B) this.builder.build(validator, element); return null; } public > StateTree then(StateTree child){ childs.add(child); return child; } public > StateTree then(Function checker){ StateTree state = new StateTree<>(); state.checker = checker; this.childs.add(state); return state; } public > StateTree loop(){ this.childs.add(this); return this; } public StateTree end(BiFunction builder){ BuilderStateTree builderState = new BuilderStateTree<>(builder); this.builder = builderState; return builderState; } }