code: public static void downto(Temporal from, Temporal to, TemporalUnit unit, Closure closure) {
          if (isDowntoEligible(from, to)) {
              for (Temporal i = from; isDowntoEligible(i, to); i = i.minus(1, unit)) {
                  closure.call(i);
              }
          } else {
              throw new GroovyRuntimeException("The argument (" + to +
                      ") to downto() cannot be later than the value (" + from + ") it's called on.");
          }
      }
docs: Iterates from this to the {@code to} {@link java.time.temporal.Temporal}, inclusive, decrementing by one
  {@code unit} each iteration, calling the closure once per iteration. The closure may accept a single
  {@link java.time.temporal.Temporal} argument.
  <p>
  If the unit is too large to iterate to the second Temporal exactly, such as iterating from two LocalDateTimes
  that are seconds apart using {@link java.time.temporal.ChronoUnit#DAYS} as the unit, the iteration will cease
  as soon as the current value of the iteration is earlier than the second Temporal argument. The closure will
  not be called with any value earlier than the {@code to} value.
  
  @param from    the starting Temporal
  @param to      the ending Temporal
  @param unit    the TemporalUnit to increment by
  @param closure the zero or one-argument closure to call
  @throws GroovyRuntimeException if this value is earlier than {@code to}
  @throws GroovyRuntimeException if {@code to} is a different type than this
  @since 2.5.0