1 package org.wikimedia.search.extra.superdetectnoop;
2
3 import static org.wikimedia.search.extra.superdetectnoop.ChangeHandler.TypeSafe.nullAndTypeSafe;
4
5 import javax.annotation.Nonnull;
6
7
8
9
10 public class WithinAbsoluteHandler implements ChangeHandler.NonnullChangeHandler<Number> {
11 public static class Recognizer implements ChangeHandler.Recognizer {
12 private static final String PREFIX = "within ";
13
14 @Override
15 public ChangeHandler<Object> build(String description) {
16 if (!description.startsWith(PREFIX)) {
17 return null;
18 }
19 try {
20 double absoluteDifference = Double.parseDouble(description.substring(PREFIX.length(), description.length()));
21 return nullAndTypeSafe(Number.class, new WithinAbsoluteHandler(absoluteDifference));
22 } catch (NumberFormatException e) {
23 return null;
24 }
25 }
26 }
27
28 private final double absoluteDifference;
29
30 public WithinAbsoluteHandler(double absoluteDifference) {
31 this.absoluteDifference = absoluteDifference;
32 }
33
34 @Override
35 public ChangeHandler.Result handle(@Nonnull Number oldValue, @Nonnull Number newValue) {
36 return ChangeHandler.Changed.forBoolean(Math.abs(newValue.doubleValue() - oldValue.doubleValue()) < absoluteDifference,
37 newValue);
38 }
39 }