1 package io.github.robertograham.rleparser.domain;
2
3 import java.util.Objects;
4 import java.util.Set;
5 import java.util.function.Function;
6 import java.util.stream.Collectors;
7
8 public class LiveCells {
9
10 private final Set<Coordinate> coordinates;
11
12 public LiveCells(Set<Coordinate> coordinates) {
13 this.coordinates = coordinates;
14 }
15
16 public Set<Coordinate> getCoordinates() {
17 return coordinates;
18 }
19
20 public LiveCells filteredByX(int x) {
21 return new LiveCells(getCoordinatesWithPropertyEqualToValue(x, Coordinate::getX));
22 }
23
24 public LiveCells filteredByY(int y) {
25 return new LiveCells(getCoordinatesWithPropertyEqualToValue(y, Coordinate::getY));
26 }
27
28 @Override
29 public String toString() {
30 return "LiveCells{" +
31 "coordinates=" + coordinates +
32 '}';
33 }
34
35 @Override
36 public boolean equals(Object object) {
37 if (this == object)
38 return true;
39
40 if (!(object instanceof LiveCells))
41 return false;
42
43 LiveCells liveCells = (LiveCells) object;
44
45 return Objects.equals(coordinates, liveCells.coordinates);
46 }
47
48 @Override
49 public int hashCode() {
50 return Objects.hash(coordinates);
51 }
52
53 private Set<Coordinate> getCoordinatesWithPropertyEqualToValue(int value, Function<Coordinate, Integer> coordinatePropertyAccessor) {
54 return coordinates.stream()
55 .filter(coordinate -> value == coordinatePropertyAccessor.apply(coordinate))
56 .collect(Collectors.toSet());
57 }
58 }