summaryrefslogtreecommitdiff
path: root/dice/src/main/java/bjc/dicelang/neodice/IDie.java
diff options
context:
space:
mode:
authorBen Culkin <scorpress@gmail.com>2020-11-21 23:11:43 -0500
committerBen Culkin <scorpress@gmail.com>2020-11-21 23:11:43 -0500
commiteda9a86d8d48758e9982cfffd470c3b38a0a4b0b (patch)
treefbe073650de751486725844ed41dfe70986a914d /dice/src/main/java/bjc/dicelang/neodice/IDie.java
parentb5c2fb1ed923d43412694729b4445a66fa9f47fc (diff)
Make dice generic
Convert dice from dealing exclusively with ints, to deal with objects of arbitrary types
Diffstat (limited to 'dice/src/main/java/bjc/dicelang/neodice/IDie.java')
-rw-r--r--dice/src/main/java/bjc/dicelang/neodice/IDie.java96
1 files changed, 96 insertions, 0 deletions
diff --git a/dice/src/main/java/bjc/dicelang/neodice/IDie.java b/dice/src/main/java/bjc/dicelang/neodice/IDie.java
new file mode 100644
index 0000000..274af66
--- /dev/null
+++ b/dice/src/main/java/bjc/dicelang/neodice/IDie.java
@@ -0,0 +1,96 @@
+package bjc.dicelang.neodice;
+
+import java.util.*;
+import java.util.function.*;
+import java.util.stream.*;
+
+import bjc.dicelang.neodice.die.*;
+import bjc.dicelang.neodice.diepool.*;
+
+/**
+ * Represents a single polyhedral die.
+ * @author Ben Culkin
+ *
+ */
+@FunctionalInterface
+public interface IDie<SideType> {
+ /**
+ * Rolls this die.
+ *
+ * @param rng The source for random numbers
+ *
+ * @return The result of rolling the die.
+ */
+ public SideType roll(Random rng);
+
+ /**
+ * Returns a die pool which rolls this die the specified number of times.
+ *
+ * @param numTimes The number of times to roll this die.
+ *
+ * @return A die pool that rolls this die the specified number of times.
+ */
+ default IDiePool<SideType> times(int numTimes) {
+ return new ExpandDiePool<>(this, (die, rng) -> {
+ return Stream.generate(() -> die.roll(rng))
+ .limit(numTimes);
+ });
+ };
+
+ /**
+ * Returns a die which will reroll this die as long as the provided condition is true.
+ *
+ * @param condition The condition to reroll the die on.
+ *
+ * @return A die that rerolls when the given condition is met.
+ */
+ default IDie<SideType> reroll(
+ Comparator<SideType> comparer,
+ Predicate<SideType> condition) {
+ return RerollDie.create(comparer, this, condition,
+ (list) -> list.get(list.size()));
+ }
+
+ /**
+ * Returns a die which will reroll this die up to a specified number of times,
+ * as long as the provided condition is true.
+ *
+ * @param condition The condition to reroll the die on.
+ * @param limit The maximum number of times to reroll the die.
+ *
+ * @return A die that rerolls when the given condition is met.
+ */
+ default IDie<SideType> reroll(
+ Comparator<SideType> comparer,
+ Predicate<SideType> condition,
+ int limit) {
+ return RerollDie.create(comparer, this, condition,
+ (list) -> list.get(list.size()), limit);
+ }
+
+ /**
+ * Create an stream which gives rolls of this dice.
+ *
+ * @param rng The source for random numbers.
+ *
+ * @return An iterator which gives rolls of this dice.
+ */
+ default Stream<SideType> stream(Random rng) {
+ return Stream.generate(() -> this.roll(rng));
+ }
+
+ default <NewType> IDie<NewType> transform(Function<SideType, NewType> mapper) {
+ return (rng) -> mapper.apply(this.roll(rng));
+ }
+
+ /**
+ * Create a simple polyhedral die with a fixed number of sides.
+ *
+ * @param sides The number of sides for the die.
+ *
+ * @return A die which returns a result from 1 to sides.
+ */
+ static IDie<Integer> polyhedral(int sides) {
+ return new PolyhedralDie(sides);
+ }
+} \ No newline at end of file