summaryrefslogtreecommitdiff
path: root/dice/src/main/java/bjc/dicelang/neodice/diepool
diff options
context:
space:
mode:
Diffstat (limited to 'dice/src/main/java/bjc/dicelang/neodice/diepool')
-rw-r--r--dice/src/main/java/bjc/dicelang/neodice/diepool/DropFirstPool.java58
-rw-r--r--dice/src/main/java/bjc/dicelang/neodice/diepool/DropLastPool.java58
-rw-r--r--dice/src/main/java/bjc/dicelang/neodice/diepool/ExpandDiePool.java25
-rw-r--r--dice/src/main/java/bjc/dicelang/neodice/diepool/FilteredDiePool.java47
-rw-r--r--dice/src/main/java/bjc/dicelang/neodice/diepool/FixedDiePool.java53
-rw-r--r--dice/src/main/java/bjc/dicelang/neodice/diepool/KeepFirstDiePool.java58
-rw-r--r--dice/src/main/java/bjc/dicelang/neodice/diepool/KeepLastDiePool.java58
-rw-r--r--dice/src/main/java/bjc/dicelang/neodice/diepool/SortedDiePool.java63
-rw-r--r--dice/src/main/java/bjc/dicelang/neodice/diepool/TimesDiePool.java26
-rw-r--r--dice/src/main/java/bjc/dicelang/neodice/diepool/TransformDiePool.java52
10 files changed, 110 insertions, 388 deletions
diff --git a/dice/src/main/java/bjc/dicelang/neodice/diepool/DropFirstPool.java b/dice/src/main/java/bjc/dicelang/neodice/diepool/DropFirstPool.java
deleted file mode 100644
index 959678b..0000000
--- a/dice/src/main/java/bjc/dicelang/neodice/diepool/DropFirstPool.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package bjc.dicelang.neodice.diepool;
-
-import java.util.*;
-
-import bjc.dicelang.neodice.*;
-
-public class DropFirstPool implements DiePool {
- private final int number;
- private final DiePool pool;
-
- public DropFirstPool(DiePool pool, int number) {
- this.pool = pool;
- this.number = number;
- }
-
- @Override
- public int[] roll(Random rng) {
- int[] rolls = pool.roll(rng);
-
- if (number >= rolls.length) {
- return new int[0];
- } else {
- int[] newRolls = new int[rolls.length - number];
-
- for (int index = number - 1; index < rolls.length; index++) {
- newRolls[index - number] = rolls[index];
- }
-
- return newRolls;
- }
- }
-
- @Override
- public Die[] contained() {
- return pool.contained();
- }
-
- @Override
- public String toString() {
- return String.format("%sdF%d", pool, number);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(number, pool);
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) return true;
- if (obj == null) return false;
- if (getClass() != obj.getClass()) return false;
-
- DropFirstPool other = (DropFirstPool) obj;
-
- return number == other.number && Objects.equals(pool, other.pool);
- }
-} \ No newline at end of file
diff --git a/dice/src/main/java/bjc/dicelang/neodice/diepool/DropLastPool.java b/dice/src/main/java/bjc/dicelang/neodice/diepool/DropLastPool.java
deleted file mode 100644
index 9503e8f..0000000
--- a/dice/src/main/java/bjc/dicelang/neodice/diepool/DropLastPool.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package bjc.dicelang.neodice.diepool;
-
-import java.util.*;
-
-import bjc.dicelang.neodice.*;
-
-public class DropLastPool implements DiePool {
- private final int number;
- private final DiePool pool;
-
- public DropLastPool(DiePool pool, int number) {
- this.pool = pool;
- this.number = number;
- }
-
- @Override
- public int[] roll(Random rng) {
- int[] rolls = pool.roll(rng);
-
- if (number >= rolls.length) {
- return new int[0];
- } else {
- int[] newRolls = new int[rolls.length - number];
-
- for (int index = 0; index < rolls.length - number; index++) {
- newRolls[index] = rolls[index];
- }
-
- return newRolls;
- }
- }
-
- @Override
- public Die[] contained() {
- return pool.contained();
- }
-
- @Override
- public String toString() {
- return String.format("%sdL%d", pool, number);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(number, pool);
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) return true;
- if (obj == null) return false;
- if (getClass() != obj.getClass()) return false;
-
- DropLastPool other = (DropLastPool) obj;
-
- return number == other.number && Objects.equals(pool, other.pool);
- }
-} \ No newline at end of file
diff --git a/dice/src/main/java/bjc/dicelang/neodice/diepool/ExpandDiePool.java b/dice/src/main/java/bjc/dicelang/neodice/diepool/ExpandDiePool.java
new file mode 100644
index 0000000..7c58e72
--- /dev/null
+++ b/dice/src/main/java/bjc/dicelang/neodice/diepool/ExpandDiePool.java
@@ -0,0 +1,25 @@
+package bjc.dicelang.neodice.diepool;
+
+import java.util.*;
+import java.util.function.*;
+import java.util.stream.*;
+
+import bjc.dicelang.neodice.*;
+
+public class ExpandDiePool<SideType> implements IDiePool<SideType> {
+ private final IDie<SideType> contained;
+
+ private final BiFunction<IDie<SideType>, Random, Stream<SideType>> expander;
+
+ public ExpandDiePool(IDie<SideType> contained,
+ BiFunction<IDie<SideType>, Random, Stream<SideType>> expander) {
+ this.contained = contained;
+ this.expander = expander;
+ }
+
+
+ @Override
+ public Stream<SideType> roll(Random rng) {
+ return expander.apply(contained, rng);
+ }
+}
diff --git a/dice/src/main/java/bjc/dicelang/neodice/diepool/FilteredDiePool.java b/dice/src/main/java/bjc/dicelang/neodice/diepool/FilteredDiePool.java
deleted file mode 100644
index 34d274f..0000000
--- a/dice/src/main/java/bjc/dicelang/neodice/diepool/FilteredDiePool.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package bjc.dicelang.neodice.diepool;
-
-import java.util.*;
-import java.util.function.*;
-
-import bjc.dicelang.neodice.*;
-
-public class FilteredDiePool implements DiePool {
- private final DiePool pool;
- private final IntPredicate filter;
-
- public FilteredDiePool(DiePool pool, IntPredicate filter) {
- this.pool = pool;
- this.filter = filter;
- }
-
- @Override
- public int[] roll(Random rng) {
- int[] rolls = pool.roll(rng);
-
- return Arrays.stream(rolls).filter(filter).toArray();
- }
-
- @Override
- public Die[] contained() {
- return pool.contained();
- }
-
- // No toString, since there isn't any sensible to output the filter
-
- @Override
- public int hashCode() {
- return Objects.hash(filter, pool);
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) return true;
- if (obj == null) return false;
- if (getClass() != obj.getClass()) return false;
-
- FilteredDiePool other = (FilteredDiePool) obj;
-
- return Objects.equals(filter, other.filter)
- && Objects.equals(pool, other.pool);
- }
-} \ No newline at end of file
diff --git a/dice/src/main/java/bjc/dicelang/neodice/diepool/FixedDiePool.java b/dice/src/main/java/bjc/dicelang/neodice/diepool/FixedDiePool.java
index c60b88a..a536f62 100644
--- a/dice/src/main/java/bjc/dicelang/neodice/diepool/FixedDiePool.java
+++ b/dice/src/main/java/bjc/dicelang/neodice/diepool/FixedDiePool.java
@@ -1,55 +1,46 @@
package bjc.dicelang.neodice.diepool;
import java.util.*;
+import java.util.stream.*;
import bjc.dicelang.neodice.*;
-public class FixedDiePool implements DiePool {
- private final Die[] dice;
+public class FixedDiePool<SideType> implements IDiePool<SideType> {
+ private final List<IDie<SideType>> dice;
- public FixedDiePool(Die[] dice) {
+ public FixedDiePool(List<IDie<SideType>> dice) {
this.dice = dice;
}
+
+ @SafeVarargs
+ public FixedDiePool(IDie<SideType>...dice) {
+ this.dice = new ArrayList<>(dice.length);
+ for (IDie<SideType> die : dice) {
+ this.dice.add(die);
+ }
+ }
@Override
- public int[] roll(Random rng) {
- int[] results = new int[dice.length];
-
- for (int index = 0; index < dice.length; index++) {
- results[index] = dice[index].roll(rng);
- }
-
- return results;
+ public Stream<SideType> roll(Random rng) {
+ return dice.stream().map((die) -> die.roll(rng));
}
@Override
- public Die[] contained() {
+ public List<IDie<SideType>> contained() {
return dice;
}
@Override
public String toString() {
- StringBuilder builder = new StringBuilder();
-
- for (int i = 0; i < dice.length; i++) {
- Die die = dice[i];
-
- builder.append(die);
-
- // Don't add an extra trailing comma
- if (i < dice.length - 1) builder.append(", ");
- }
-
- return builder.toString();
+ return dice.stream()
+ .map(IDie<SideType>::toString)
+ .collect(Collectors.joining(", "));
}
@Override
public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + Arrays.hashCode(dice);
- return result;
+ return Objects.hash(dice);
}
@Override
@@ -57,9 +48,9 @@ public class FixedDiePool implements DiePool {
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
+
+ FixedDiePool<?> other = (FixedDiePool<?>) obj;
- FixedDiePool other = (FixedDiePool) obj;
-
- return Arrays.equals(dice, other.dice);
+ return Objects.equals(dice, other.dice);
}
} \ No newline at end of file
diff --git a/dice/src/main/java/bjc/dicelang/neodice/diepool/KeepFirstDiePool.java b/dice/src/main/java/bjc/dicelang/neodice/diepool/KeepFirstDiePool.java
deleted file mode 100644
index d31f104..0000000
--- a/dice/src/main/java/bjc/dicelang/neodice/diepool/KeepFirstDiePool.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package bjc.dicelang.neodice.diepool;
-
-import java.util.*;
-
-import bjc.dicelang.neodice.*;
-
-public class KeepFirstDiePool implements DiePool {
- private final int number;
- private final DiePool pool;
-
- public KeepFirstDiePool(DiePool pool, int number) {
- this.pool = pool;
- this.number = number;
- }
-
- @Override
- public int[] roll(Random rng) {
- int[] rolls = pool.roll(rng);
-
- if (rolls.length >= number) {
- return rolls;
- } else {
- int[] newRolls = new int[number];
-
- for (int index = 0; index < number; index++) {
- newRolls[index] = rolls[index];
- }
-
- return newRolls;
- }
- }
-
- @Override
- public Die[] contained() {
- return pool.contained();
- }
-
- @Override
- public String toString() {
- return String.format("%skF%d", pool, number);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(number, pool);
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) return true;
- if (obj == null) return false;
- if (getClass() != obj.getClass()) return false;
-
- KeepFirstDiePool other = (KeepFirstDiePool) obj;
-
- return number == other.number && Objects.equals(pool, other.pool);
- }
-} \ No newline at end of file
diff --git a/dice/src/main/java/bjc/dicelang/neodice/diepool/KeepLastDiePool.java b/dice/src/main/java/bjc/dicelang/neodice/diepool/KeepLastDiePool.java
deleted file mode 100644
index 1e2d1ae..0000000
--- a/dice/src/main/java/bjc/dicelang/neodice/diepool/KeepLastDiePool.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package bjc.dicelang.neodice.diepool;
-
-import java.util.*;
-
-import bjc.dicelang.neodice.*;
-
-public class KeepLastDiePool implements DiePool {
- private final int number;
- private final DiePool pool;
-
- public KeepLastDiePool(DiePool pool, int number) {
- this.pool = pool;
- this.number = number;
- }
-
- @Override
- public int[] roll(Random rng) {
- int[] rolls = pool.roll(rng);
-
- if (rolls.length >= number) {
- return rolls;
- } else {
- int[] newRolls = new int[number];
-
- for (int index = number; index > index; index--) {
- newRolls[index] = rolls[rolls.length - index];
- }
-
- return newRolls;
- }
- }
-
- @Override
- public Die[] contained() {
- return pool.contained();
- }
-
- @Override
- public String toString() {
- return String.format("%skL%d", pool, number);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(number, pool);
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) return true;
- if (obj == null) return false;
- if (getClass() != obj.getClass()) return false;
-
- KeepLastDiePool other = (KeepLastDiePool) obj;
-
- return number == other.number && Objects.equals(pool, other.pool);
- }
-} \ No newline at end of file
diff --git a/dice/src/main/java/bjc/dicelang/neodice/diepool/SortedDiePool.java b/dice/src/main/java/bjc/dicelang/neodice/diepool/SortedDiePool.java
deleted file mode 100644
index 79599c1..0000000
--- a/dice/src/main/java/bjc/dicelang/neodice/diepool/SortedDiePool.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package bjc.dicelang.neodice.diepool;
-
-import java.util.*;
-
-import bjc.dicelang.neodice.*;
-
-public class SortedDiePool implements DiePool {
- private final boolean isDescending;
- private final DiePool pool;
-
- public SortedDiePool(DiePool pool, boolean isDescending) {
- this.pool = pool;
- this.isDescending = isDescending;
- }
-
- @Override
- public int[] roll(Random rng) {
- int[] rolls = pool.roll(rng);
-
- Arrays.sort(rolls);
-
- if (isDescending) {
- int[] newRolls = new int[rolls.length];
-
- int newIndex = newRolls.length;
- for (int index = 0; index < rolls.length; index++) {
- newRolls[newIndex--] = rolls[index];
- }
-
- return newRolls;
- } else {
- return rolls;
- }
- }
-
- @Override
- public Die[] contained() {
- return pool.contained();
- }
-
- @Override
- public String toString() {
- return String.format("%s (sorted %s)", pool,
- isDescending ? " descending" : "ascending");
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(isDescending, pool);
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) return true;
- if (obj == null) return false;
- if (getClass() != obj.getClass()) return false;
-
- SortedDiePool other = (SortedDiePool) obj;
-
- return isDescending == other.isDescending
- && Objects.equals(pool, other.pool);
- }
-} \ No newline at end of file
diff --git a/dice/src/main/java/bjc/dicelang/neodice/diepool/TimesDiePool.java b/dice/src/main/java/bjc/dicelang/neodice/diepool/TimesDiePool.java
index 1b34247..56fe0e5 100644
--- a/dice/src/main/java/bjc/dicelang/neodice/diepool/TimesDiePool.java
+++ b/dice/src/main/java/bjc/dicelang/neodice/diepool/TimesDiePool.java
@@ -1,35 +1,31 @@
package bjc.dicelang.neodice.diepool;
import java.util.*;
+import java.util.stream.*;
import bjc.dicelang.neodice.*;
-public class TimesDiePool implements DiePool {
- private final Die contained;
+public class TimesDiePool<SideType> implements IDiePool<SideType> {
+ private final IDie<SideType> contained;
private final int numDice;
- public TimesDiePool(Die contained, int numDice) {
+ public TimesDiePool(IDie<SideType> contained, int numDice) {
this.contained = contained;
this.numDice = numDice;
}
@Override
- public int[] roll(Random rng) {
- int[] results = new int[numDice];
-
- for (int index = 0; index < numDice; index++) {
- results[index] = contained.roll(rng);
- }
-
- return results;
+ public Stream<SideType> roll(Random rng) {
+ return Stream.generate(() -> contained.roll(rng))
+ .limit(numDice);
}
@Override
- public Die[] contained() {
- Die[] results = new Die[numDice];
+ public List<IDie<SideType>> contained() {
+ List<IDie<SideType>> results = new ArrayList<>(numDice);
for (int index = 0; index < numDice; index++) {
- results[index] = contained;
+ results.add(contained);
}
return results;
@@ -51,7 +47,7 @@ public class TimesDiePool implements DiePool {
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
- TimesDiePool other = (TimesDiePool) obj;
+ TimesDiePool<?> other = (TimesDiePool<?>) obj;
return Objects.equals(contained, other.contained) && numDice == other.numDice;
}
diff --git a/dice/src/main/java/bjc/dicelang/neodice/diepool/TransformDiePool.java b/dice/src/main/java/bjc/dicelang/neodice/diepool/TransformDiePool.java
new file mode 100644
index 0000000..f590e91
--- /dev/null
+++ b/dice/src/main/java/bjc/dicelang/neodice/diepool/TransformDiePool.java
@@ -0,0 +1,52 @@
+package bjc.dicelang.neodice.diepool;
+
+import java.util.*;
+import java.util.function.*;
+import java.util.stream.*;
+
+import bjc.dicelang.neodice.*;
+
+public class TransformDiePool<SideType> implements IDiePool<SideType> {
+ private final IDiePool<SideType> contained;
+
+ private UnaryOperator<Stream<SideType>> transform;
+
+ public TransformDiePool(IDiePool<SideType> contained,
+ UnaryOperator<Stream<SideType>> transform) {
+ super();
+ this.contained = contained;
+ this.transform = transform;
+ }
+
+ @Override
+ public Stream<SideType> roll(Random rng) {
+ return transform.apply(contained.roll(rng));
+ }
+
+ @Override
+ public List<IDie<SideType>> contained() {
+ return contained.contained();
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(contained, transform);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) return true;
+ if (obj == null) return false;
+ if (getClass() != obj.getClass()) return false;
+
+ TransformDiePool<?> other = (TransformDiePool<?>) obj;
+
+ return Objects.equals(contained, other.contained)
+ && Objects.equals(transform, other.transform);
+ }
+
+ @Override
+ public String toString() {
+ return contained.toString() + "(transformed)";
+ }
+}