From eda9a86d8d48758e9982cfffd470c3b38a0a4b0b Mon Sep 17 00:00:00 2001 From: Ben Culkin Date: Sat, 21 Nov 2020 23:11:43 -0500 Subject: Make dice generic Convert dice from dealing exclusively with ints, to deal with objects of arbitrary types --- .../java/bjc/dicelang/neodice/die/RerollDie.java | 75 ++++++++++++++++------ 1 file changed, 56 insertions(+), 19 deletions(-) (limited to 'dice/src/main/java/bjc/dicelang/neodice/die/RerollDie.java') diff --git a/dice/src/main/java/bjc/dicelang/neodice/die/RerollDie.java b/dice/src/main/java/bjc/dicelang/neodice/die/RerollDie.java index 3cd369f..f8cb0fa 100644 --- a/dice/src/main/java/bjc/dicelang/neodice/die/RerollDie.java +++ b/dice/src/main/java/bjc/dicelang/neodice/die/RerollDie.java @@ -6,39 +6,45 @@ import java.util.function.*; import bjc.dicelang.neodice.*; import bjc.esodata.*; -public class RerollDie implements Die { - private final Die contained; +public class RerollDie implements IDie { + private final IDie contained; - private final IntPredicate condition; - private final Function, Integer> chooser; + private final Predicate condition; + private final Function, SideType> chooser; - private int limit = Integer.MAX_VALUE; + private final Comparator comparer; + private int limit = Integer.MAX_VALUE; - public RerollDie(Die contained, IntPredicate condition, - Function, Integer> chooser) { + private RerollDie( + Comparator comparer, + IDie contained, + Predicate condition, + Function, SideType> chooser) { + this.comparer = comparer; + this.contained = contained; this.condition = condition; this.chooser = chooser; } - public RerollDie(Die contained, IntPredicate condition, - Function, Integer> chooser, int limit) { - this.contained = contained; - - this.condition = condition; - this.chooser = chooser; + private RerollDie( + Comparator comparer, + IDie contained, + Predicate condition, + Function, SideType> chooser, + int limit) { + this(comparer, contained, condition, chooser); this.limit = limit; } @Override - public int roll(Random rng) { - int roll = contained.roll(rng); - - MinMaxList newRolls = new MinMaxList( - Comparator.naturalOrder(), roll); + public SideType roll(Random rng) { + SideType roll = contained.roll(rng); + + MinMaxList newRolls = new MinMaxList<>(comparer, roll); int rerollCount = 0; while (condition.test(roll) && rerollCount < limit) { @@ -51,5 +57,36 @@ public class RerollDie implements Die { return chooser.apply(newRolls); } - // No toString, because IntPredicate can't be converted to a string + public static > IDie create( + IDie contained, + Predicate condition, + Function, Side> chooser) { + return new RerollDie<>(Comparator.naturalOrder(), contained, condition, chooser); + } + + public static > IDie create( + IDie contained, + Predicate condition, + Function, Side> chooser, + int limit) { + return new RerollDie<>(Comparator.naturalOrder(), contained, condition, chooser, limit); + } + + + public static IDie create( + Comparator comparer, + IDie contained, + Predicate condition, + Function, Side> chooser) { + return new RerollDie(comparer, contained, condition, chooser); + } + + public static IDie create( + Comparator comparer, + IDie contained, + Predicate condition, + Function, Side> chooser, + int limit) { + return new RerollDie(comparer, contained, condition, chooser, limit); + } } \ No newline at end of file -- cgit v1.2.3