From 02c1adbcbf7ef9a48f2a4eeccca305d87c7fd75f Mon Sep 17 00:00:00 2001 From: jeffcheasey88 Date: Thu, 8 May 2025 21:23:40 +0200 Subject: [PATCH] dev localy --- .classpath | 2 +- .../state/generator/GraphGenerator.java | 2 +- src/dev/peerat/parser/visitor/Operator.java | 33 ++++++--- src/dev/peerat/parser/visitor/VisitorBag.java | 71 +++++++++++++++---- 4 files changed, 82 insertions(+), 26 deletions(-) diff --git a/.classpath b/.classpath index c7f1dff..880f8dc 100644 --- a/.classpath +++ b/.classpath @@ -1,8 +1,8 @@ - + diff --git a/src/dev/peerat/parser/state/generator/GraphGenerator.java b/src/dev/peerat/parser/state/generator/GraphGenerator.java index 786bfc7..2f4f5eb 100644 --- a/src/dev/peerat/parser/state/generator/GraphGenerator.java +++ b/src/dev/peerat/parser/state/generator/GraphGenerator.java @@ -28,7 +28,7 @@ public class GraphGenerator { public static class Graph{ - private static Pattern PATTERN = Pattern.compile("^(\\d+)\\s+->\s+(.*)$"); + private static Pattern PATTERN = Pattern.compile("^(\\d+)\\s+->\\s+(.*)$"); private List nodes; diff --git a/src/dev/peerat/parser/visitor/Operator.java b/src/dev/peerat/parser/visitor/Operator.java index 9f54e86..36aebe0 100644 --- a/src/dev/peerat/parser/visitor/Operator.java +++ b/src/dev/peerat/parser/visitor/Operator.java @@ -18,9 +18,7 @@ public class Operator{ VisitorBag vbag = visitor.visit(element); if(!vbag.isValidated()) return new VisitorBag(); bag.merge(vbag); - for(Object computed : vbag.computeList()){ - set.add(computed); - } + set.add(vbag.computed()); } for(Object obj : set) bag.compute(obj); return bag; @@ -53,9 +51,7 @@ public class Operator{ VisitorBag vbag = visitor.visit(element); if(!vbag.isValidated()) return new VisitorBag(); bag.merge(vbag); - for(Object computed : vbag.computeList()){ - bag.compute(computed); - } + bag.compute(vbag.computed()); return bag; } return bag; @@ -94,17 +90,32 @@ public class Operator{ @Override public boolean canPropagate(){ - return true; + return visitor.canPropagate(); } }; } - public static > T key(Visitor visitor){ - return null; + public static Visitor key(Visitor visitor){ + return new Visitor(){ + @Override + public VisitorBag visit(E element){ + return visitor.visit(element).key(element); + } + + @Override + public boolean canVisit(Class type){ + return visitor.canVisit(type); + } + + @Override + public boolean canPropagate(){ + return visitor.canPropagate(); + } + }; } - public static > T value(Visitor visitor){ - return null; + public static Visitor value(Visitor visitor){ + return collect(visitor); } public static Visitor collect(Visitor visitor){ diff --git a/src/dev/peerat/parser/visitor/VisitorBag.java b/src/dev/peerat/parser/visitor/VisitorBag.java index ab77bcc..dc8a2de 100644 --- a/src/dev/peerat/parser/visitor/VisitorBag.java +++ b/src/dev/peerat/parser/visitor/VisitorBag.java @@ -1,7 +1,10 @@ package dev.peerat.parser.visitor; import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; //only one pass in parameter or visit ? public class VisitorBag{ @@ -9,36 +12,36 @@ public class VisitorBag{ private static Object VALIDATE_BAG = new Object(); private List collect; - private List list; + private Object computed; public VisitorBag(){ - this.collect = new ArrayList<>(); - this.list = new ArrayList<>(); + this.collect = new ArrayList<>(0); } public void compute(Object element){ -// System.out.println("compute("+collect+", "+list+") "+element+" <- "+Thread.currentThread().getStackTrace()[2]); - this.list.add(element); + this.computed = element; } public void merge(VisitorBag bag){ -// System.out.println("merge("+collect+", "+list+") <- "+Thread.currentThread().getStackTrace()[2]); this.collect.addAll(bag.collect); - if(!this.collect.isEmpty()) list.add(VALIDATE_BAG); -// System.out.println("merged("+collect+", "+list+") <- "+Thread.currentThread().getStackTrace()[2]); + if((!this.collect.isEmpty()) && this.computed == null) this.computed = VALIDATE_BAG; + } + + public Object computed(){ + return this.computed; } public boolean isValidated(){ - return !this.list.isEmpty(); + return this.computed != null; } - public List computeList(){ - return this.list; + VisitorBag key(Object key){ + this.collect = Arrays.asList(new Pair<>(key, this.collect)); + return this; } VisitorBag collect(){ - this.collect.addAll(this.list); -// System.out.println("collected("+collect+", "+list+") <- "+Thread.currentThread().getStackTrace()[2]); + if(this.computed != null) this.collect.add(this.computed); return this; } @@ -49,4 +52,46 @@ public class VisitorBag{ public List toList(){ return (List) this.collect; } + + public Map toMap(){ + Map map = new HashMap<>(); + for(Object obj : this.collect){ + Pair pair = (Pair)obj; + map.put(pair.getKey(), pair.getValue()); + } + return map; + } + + public Map> toMapValues(){ + Map> map = new HashMap<>(); + for(Object obj : this.collect){ + Pair pair = (Pair)obj; + map.put(pair.getKey(), pair.getValues()); + } + return map; + } + + public static class Pair{ + + private Object key; + private List values; + + public Pair(Object key, List values){ + this.key = key; + this.values = values; + } + + public K getKey(){ + return (K) this.key; + } + + public V getValue(){ + return (V)this.values.get(0); + } + + public List getValues(){ + return (List) this.values; + } + + } } \ No newline at end of file