-
Notifications
You must be signed in to change notification settings - Fork 34
/
Copy pathLadderServiceImpl.java
65 lines (51 loc) · 2.08 KB
/
LadderServiceImpl.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package service.ladder;
import domain.ladder.Ladder;
import domain.ladder.LadderInfo;
import domain.ladder.LadderLine;
import domain.ladder.LadderLineConnection;
import repository.ladder.LadderRepository;
import java.util.*;
import java.util.stream.IntStream;
public class LadderServiceImpl implements LadderService {
private final LadderRepository ladderRepository;
private static final String EDGE_OF_LADDER = "|";
public LadderServiceImpl(final LadderRepository ladderRepository) {
this.ladderRepository = ladderRepository;
}
@Override
public void makeLadder(final int width, final int height) {
ladderRepository.setLadder(new Ladder(makeLadderLines(height, width), new LadderInfo(width, height)));
}
private List<LadderLine> makeLadderLines(final int height, final int width) {
return IntStream.range(0, height)
.mapToObj(i -> makeLadderLine(width))
.toList();
}
private LadderLine makeLadderLine(final int width) {
List<Boolean> connections = makeConnections(width);
return new LadderLine(connections, makeLine(connections));
}
private List<Boolean> makeConnections(final int width) {
List<Boolean> connections = new ArrayList<Boolean>();
Random random = new Random();
while (connections.size() < width - 1) {
addConnections(connections, random.nextBoolean());
}
return connections;
}
private void addConnections(final List<Boolean> connections, final boolean isConnected) {
if (connections.isEmpty() || !isConnected || !connections.get(connections.size() - 1)) {
connections.add(isConnected);
}
}
private String makeLine(final List<Boolean> connections) {
final List<String> line = connections.stream()
.map(connection -> LadderLineConnection.of(connection).getLadderConnectionFormat())
.toList();
return String.join("", line) + EDGE_OF_LADDER;
}
@Override
public Ladder getLadder() {
return ladderRepository.getLadder();
}
}