Skip to content

Commit b01549f

Browse files
committed
Merge branch 'master' of https://github.com/fpinjava/fpinjava
2 parents 792b6d4 + 543f5f5 commit b01549f

37 files changed

Lines changed: 271 additions & 213 deletions

File tree

fpinjava-parent/fpinjava-common/src/main/java/com/fpinjava/common/List.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,7 @@ public Result<List<A>> tailOption() {
647647

648648
@Override
649649
public String mkStr(String sep) {
650-
return head.toString() + foldLeft("", s -> e -> s + sep + e.toString());
650+
return head.toString() + tail.foldLeft("", s -> e -> s + sep + e.toString());
651651
}
652652

653653
@Override
@@ -668,9 +668,9 @@ public <B> Result<List<B>> sequence(Function<A, Result<B>> f) {
668668
protected List<A> take(int n) {
669669
return this.isEmpty()
670670
? this
671-
: n > 1
671+
: n > 0
672672
? new Cons<>(head(), tail().take(n - 1))
673-
: new Cons<>(head(), list());
673+
: list();
674674
}
675675

676676
@Override

fpinjava-parent/fpinjava-lists-exercises/src/test/java/com/fpinjava/lists/exercise05_17/TripleTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public class TripleTest {
99

1010
@Test
1111
public void testTriple() {
12-
assertEquals("[2, 3, 4, 5, NIL]", Triple.triple(List.list(1, 2, 3, 4)).toString());
12+
assertEquals("[3, 6, 9, 12, NIL]", Triple.triple(List.list(1, 2, 3, 4)).toString());
1313
}
1414

1515
}

fpinjava-parent/fpinjava-state-exercises/src/main/java/com/fpinjava/state/exercise12_01/JavaRNG.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,33 @@
22

33
import com.fpinjava.common.Tuple;
44

5-
import java.util.Random;
65

76
public class JavaRNG implements RNG {
87

9-
private final Random random;
8+
private final long seed;
109

1110
private JavaRNG(long seed) {
12-
this.random = new Random(seed);
11+
this.seed = seed;
1312
}
1413

1514
private JavaRNG() {
16-
this.random = new Random();
15+
this(System.currentTimeMillis());
16+
}
17+
18+
private long nextSeed(long seed) {
19+
return (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
1720
}
1821

1922
@Override
2023
public Tuple<Integer, RNG> nextInt() {
21-
return new Tuple<>(random.nextInt(), this);
24+
return new Tuple<>((int)(seed >>> 16), new JavaRNG(nextSeed(seed)));
2225
}
2326

2427
public static RNG rng(long seed) {
25-
return new JavaRNG(seed);
28+
return new JavaRNG(seed ^ 0x5DEECE66DL & ((1L << 48) - 1));
2629
}
2730

2831
public static RNG rng() {
2932
return new JavaRNG();
3033
}
31-
}
34+
}

fpinjava-parent/fpinjava-state-exercises/src/main/java/com/fpinjava/state/exercise12_02/JavaRNG.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,33 @@
22

33
import com.fpinjava.common.Tuple;
44

5-
import java.util.Random;
65

76
public class JavaRNG implements RNG {
87

9-
private final Random random;
8+
private final long seed;
109

1110
private JavaRNG(long seed) {
12-
this.random = new Random(seed);
11+
this.seed = seed;
1312
}
1413

1514
private JavaRNG() {
16-
this.random = new Random();
15+
this(System.currentTimeMillis());
16+
}
17+
18+
private long nextSeed(long seed) {
19+
return (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
1720
}
1821

1922
@Override
2023
public Tuple<Integer, RNG> nextInt() {
21-
return new Tuple<>(random.nextInt(), this);
24+
return new Tuple<>((int)(seed >>> 16), new JavaRNG(nextSeed(seed)));
2225
}
2326

2427
public static RNG rng(long seed) {
25-
return new JavaRNG(seed);
28+
return new JavaRNG(seed ^ 0x5DEECE66DL & ((1L << 48) - 1));
2629
}
2730

2831
public static RNG rng() {
2932
return new JavaRNG();
3033
}
31-
}
34+
}

fpinjava-parent/fpinjava-state-exercises/src/main/java/com/fpinjava/state/exercise12_03/JavaRNG.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,33 @@
22

33
import com.fpinjava.common.Tuple;
44

5-
import java.util.Random;
65

76
public class JavaRNG implements RNG {
87

9-
private final Random random;
8+
private final long seed;
109

1110
private JavaRNG(long seed) {
12-
this.random = new Random(seed);
11+
this.seed = seed;
1312
}
1413

1514
private JavaRNG() {
16-
this.random = new Random();
15+
this(System.currentTimeMillis());
16+
}
17+
18+
private long nextSeed(long seed) {
19+
return (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
1720
}
1821

1922
@Override
2023
public Tuple<Integer, RNG> nextInt() {
21-
return new Tuple<>(random.nextInt(), this);
24+
return new Tuple<>((int)(seed >>> 16), new JavaRNG(nextSeed(seed)));
2225
}
2326

2427
public static RNG rng(long seed) {
25-
return new JavaRNG(seed);
28+
return new JavaRNG(seed ^ 0x5DEECE66DL & ((1L << 48) - 1));
2629
}
2730

2831
public static RNG rng() {
2932
return new JavaRNG();
3033
}
31-
}
34+
}

fpinjava-parent/fpinjava-state-exercises/src/main/java/com/fpinjava/state/exercise12_04/JavaRNG.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,33 @@
22

33
import com.fpinjava.common.Tuple;
44

5-
import java.util.Random;
65

76
public class JavaRNG implements RNG {
87

9-
private final Random random;
8+
private final long seed;
109

1110
private JavaRNG(long seed) {
12-
this.random = new Random(seed);
11+
this.seed = seed;
1312
}
1413

1514
private JavaRNG() {
16-
this.random = new Random();
15+
this(System.currentTimeMillis());
16+
}
17+
18+
private long nextSeed(long seed) {
19+
return (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
1720
}
1821

1922
@Override
2023
public Tuple<Integer, RNG> nextInt() {
21-
return new Tuple<>(random.nextInt(), this);
24+
return new Tuple<>((int)(seed >>> 16), new JavaRNG(nextSeed(seed)));
2225
}
2326

2427
public static RNG rng(long seed) {
25-
return new JavaRNG(seed);
28+
return new JavaRNG(seed ^ 0x5DEECE66DL & ((1L << 48) - 1));
2629
}
2730

2831
public static RNG rng() {
2932
return new JavaRNG();
3033
}
31-
}
34+
}

fpinjava-parent/fpinjava-state-exercises/src/main/java/com/fpinjava/state/exercise12_05/JavaRNG.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,33 @@
22

33
import com.fpinjava.common.Tuple;
44

5-
import java.util.Random;
65

76
public class JavaRNG implements RNG {
87

9-
private final Random random;
8+
private final long seed;
109

1110
private JavaRNG(long seed) {
12-
this.random = new Random(seed);
11+
this.seed = seed;
1312
}
1413

1514
private JavaRNG() {
16-
this.random = new Random();
15+
this(System.currentTimeMillis());
16+
}
17+
18+
private long nextSeed(long seed) {
19+
return (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
1720
}
1821

1922
@Override
2023
public Tuple<Integer, RNG> nextInt() {
21-
return new Tuple<>(random.nextInt(), this);
24+
return new Tuple<>((int)(seed >>> 16), new JavaRNG(nextSeed(seed)));
2225
}
2326

2427
public static RNG rng(long seed) {
25-
return new JavaRNG(seed);
28+
return new JavaRNG(seed ^ 0x5DEECE66DL & ((1L << 48) - 1));
2629
}
2730

2831
public static RNG rng() {
2932
return new JavaRNG();
3033
}
31-
}
34+
}

fpinjava-parent/fpinjava-state-exercises/src/main/java/com/fpinjava/state/exercise12_06/JavaRNG.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,33 @@
22

33
import com.fpinjava.common.Tuple;
44

5-
import java.util.Random;
65

76
public class JavaRNG implements RNG {
87

9-
private final Random random;
8+
private final long seed;
109

1110
private JavaRNG(long seed) {
12-
this.random = new Random(seed);
11+
this.seed = seed;
1312
}
1413

1514
private JavaRNG() {
16-
this.random = new Random();
15+
this(System.currentTimeMillis());
16+
}
17+
18+
private long nextSeed(long seed) {
19+
return (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
1720
}
1821

1922
@Override
2023
public Tuple<Integer, RNG> nextInt() {
21-
return new Tuple<>(random.nextInt(), this);
24+
return new Tuple<>((int)(seed >>> 16), new JavaRNG(nextSeed(seed)));
2225
}
2326

2427
public static RNG rng(long seed) {
25-
return new JavaRNG(seed);
28+
return new JavaRNG(seed ^ 0x5DEECE66DL & ((1L << 48) - 1));
2629
}
2730

2831
public static RNG rng() {
2932
return new JavaRNG();
3033
}
31-
}
34+
}

fpinjava-parent/fpinjava-state-exercises/src/main/java/com/fpinjava/state/exercise12_07/JavaRNG.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,33 @@
22

33
import com.fpinjava.common.Tuple;
44

5-
import java.util.Random;
65

76
public class JavaRNG implements RNG {
87

9-
private final Random random;
8+
private final long seed;
109

1110
private JavaRNG(long seed) {
12-
this.random = new Random(seed);
11+
this.seed = seed;
1312
}
1413

1514
private JavaRNG() {
16-
this.random = new Random();
15+
this(System.currentTimeMillis());
16+
}
17+
18+
private long nextSeed(long seed) {
19+
return (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
1720
}
1821

1922
@Override
2023
public Tuple<Integer, RNG> nextInt() {
21-
return new Tuple<>(random.nextInt(), this);
24+
return new Tuple<>((int)(seed >>> 16), new JavaRNG(nextSeed(seed)));
2225
}
2326

2427
public static RNG rng(long seed) {
25-
return new JavaRNG(seed);
28+
return new JavaRNG(seed ^ 0x5DEECE66DL & ((1L << 48) - 1));
2629
}
2730

2831
public static RNG rng() {
2932
return new JavaRNG();
3033
}
31-
}
34+
}

fpinjava-parent/fpinjava-state-exercises/src/main/java/com/fpinjava/state/exercise12_08/JavaRNG.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,33 @@
22

33
import com.fpinjava.common.Tuple;
44

5-
import java.util.Random;
65

76
public class JavaRNG implements RNG {
87

9-
private final Random random;
8+
private final long seed;
109

1110
private JavaRNG(long seed) {
12-
this.random = new Random(seed);
11+
this.seed = seed;
1312
}
1413

1514
private JavaRNG() {
16-
this.random = new Random();
15+
this(System.currentTimeMillis());
16+
}
17+
18+
private long nextSeed(long seed) {
19+
return (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
1720
}
1821

1922
@Override
2023
public Tuple<Integer, RNG> nextInt() {
21-
return new Tuple<>(random.nextInt(), this);
24+
return new Tuple<>((int)(seed >>> 16), new JavaRNG(nextSeed(seed)));
2225
}
2326

2427
public static RNG rng(long seed) {
25-
return new JavaRNG(seed);
28+
return new JavaRNG(seed ^ 0x5DEECE66DL & ((1L << 48) - 1));
2629
}
2730

2831
public static RNG rng() {
2932
return new JavaRNG();
3033
}
31-
}
34+
}

0 commit comments

Comments
 (0)