1 package io.github.robertograham.rleparser.helper;
 2 
 3 import io.github.robertograham.rleparser.domain.Coordinate;
 4 import io.github.robertograham.rleparser.domain.StatusRun;
 5 import io.github.robertograham.rleparser.domain.enumeration.Status;
 6 
 7 import java.util.Set;
 8 import java.util.regex.Matcher;
 9 import java.util.regex.Pattern;
10 import java.util.stream.Collectors;
11 import java.util.stream.IntStream;
12 
13 public class StatusRunHelper {
14 
15     private static final Pattern STATUS_RUN_PATTERN = Pattern.compile("(\\d*)([a-z$])");
16 
17     public static StatusRun readStatusRun(String encodedStatusRun, Coordinate origin) {
18         Matcher matcher = STATUS_RUN_PATTERN.matcher(encodedStatusRun);
19 
20         if (matcher.find())
21             return new StatusRun(
22                     matcher.group(1).isEmpty() ?
23                             1
24                             : Integer.parseInt(matcher.group(1)),
25                     Status.fromCode(matcher.group(2)),
26                     origin
27             );
28 
29         throw new IllegalArgumentException("Encoded run length status did not match (\\d*)([a-z$])");
30     }
31 
32     public static Set<Coordinate> readCoordinates(StatusRun statusRun) {
33         return IntStream.range(statusRun.getOrigin().getX(), statusRun.getOrigin().getX() + statusRun.getLength())
34                 .mapToObj(statusRun.getOrigin()::withX)
35                 .collect(Collectors.toSet());
36     }
37 }