code: @VisibleForTesting
      NearestValue getNearestForwardValue(final int reference, int shiftsToApply) {
          final List<Integer> temporaryValues = new ArrayList<>(this.values);
          int index = 0;
          boolean foundGreater = false;
          final AtomicInteger shift = new AtomicInteger(0);
          if (!temporaryValues.contains(reference)) {
              for (final Integer value : temporaryValues) {
                  if (value > reference) {
                      index = temporaryValues.indexOf(value);
                      shiftsToApply--;//we just moved a position!
                      foundGreater = true;
                      break;
                  }
              }
              if (!foundGreater) {
                  shift.incrementAndGet();
              }
          } else {
              index = temporaryValues.indexOf(reference);
          }
          int value = temporaryValues.get(index);
          for (int j = 0; j < shiftsToApply; j++) {
              value = getValueFromList(temporaryValues, index + 1, shift);
              index = temporaryValues.indexOf(value);
          }
          return new NearestValue(value, shift.get());
      }
docs: We return same reference value if matches or next one if does not match.
  Then we start applying shifts.
  This way we ensure same value is returned if no shift is requested.
  
  @param reference     - reference value
  @param shiftsToApply - shifts to apply
  @return NearestValue instance, never null. Holds information on nearest (forward) value and shifts performed.