summaryrefslogtreecommitdiff
path: root/dice/src/main/java/bjc/dicelang/dicev2/ReduceDieMod.java
diff options
context:
space:
mode:
Diffstat (limited to 'dice/src/main/java/bjc/dicelang/dicev2/ReduceDieMod.java')
-rw-r--r--dice/src/main/java/bjc/dicelang/dicev2/ReduceDieMod.java53
1 files changed, 53 insertions, 0 deletions
diff --git a/dice/src/main/java/bjc/dicelang/dicev2/ReduceDieMod.java b/dice/src/main/java/bjc/dicelang/dicev2/ReduceDieMod.java
new file mode 100644
index 0000000..266e270
--- /dev/null
+++ b/dice/src/main/java/bjc/dicelang/dicev2/ReduceDieMod.java
@@ -0,0 +1,53 @@
+package bjc.dicelang.dicev2;
+
+import java.util.function.LongBinaryOperator;
+
+public class ReduceDieMod extends Die {
+ public final Die[] dice;
+
+ public final LongBinaryOperator fold;
+ public final long initial;
+
+ public ReduceDieMod(LongBinaryOperator fold, long initial, Die... dice) {
+ super();
+
+ this.dice = dice;
+
+ this.fold = fold;
+ this.initial = initial;
+ }
+
+ public long[] roll() {
+ return new long[] { rollSingle() };
+ }
+
+ public long rollSingle() {
+ long res = initial;
+
+ for(Die die : dice) {
+ for(long val : die.roll()) {
+ res = fold.applyAsLong(res, val);
+ }
+ }
+
+ return res;
+ }
+
+ public boolean canOptimize() {
+ for(Die die : dice) {
+ if(!die.canOptimize()) return false;
+ }
+
+ return true;
+ }
+
+ public long optimize() {
+ long res = 0;
+
+ for(Die die : dice) {
+ res = fold.applyAsLong(res, die.optimize());
+ }
+
+ return res;
+ }
+}