summaryrefslogtreecommitdiff
path: root/base/src/main/java/bjc/utils/parserutils/defines/IteratedDefine.java
diff options
context:
space:
mode:
Diffstat (limited to 'base/src/main/java/bjc/utils/parserutils/defines/IteratedDefine.java')
-rw-r--r--base/src/main/java/bjc/utils/parserutils/defines/IteratedDefine.java48
1 files changed, 48 insertions, 0 deletions
diff --git a/base/src/main/java/bjc/utils/parserutils/defines/IteratedDefine.java b/base/src/main/java/bjc/utils/parserutils/defines/IteratedDefine.java
new file mode 100644
index 0000000..552b471
--- /dev/null
+++ b/base/src/main/java/bjc/utils/parserutils/defines/IteratedDefine.java
@@ -0,0 +1,48 @@
+package bjc.utils.parserutils.defines;
+
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.function.UnaryOperator;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import bjc.utils.data.CircularIterator;
+
+public class IteratedDefine implements UnaryOperator<String> {
+ private Pattern patt;
+
+ private Iterator<String> repls;
+
+ /**
+ * Create a new iterated define.
+ *
+ * @param pattern
+ * The pattern to use for matching.
+ * @param circular
+ * Whether or not to loop through the list of replacers, or just
+ * repeat the last one.
+ * @param replacers
+ * The set of replacers to use.
+ */
+ public IteratedDefine(Pattern pattern, boolean circular, String... replacers) {
+ patt = pattern;
+
+ repls = new CircularIterator<>(Arrays.asList(replacers), circular);
+ }
+
+ @Override
+ public String apply(String ln) {
+ Matcher mat = patt.matcher(ln);
+ StringBuffer sb = new StringBuffer();
+
+ while(mat.find()) {
+ String repl = repls.next();
+
+ mat.appendReplacement(sb, repl);
+ }
+
+ mat.appendTail(sb);
+
+ return sb.toString();
+ }
+}