View Javadoc

1   package com.atlassian.vcache.internal.core.metrics;
2   
3   import java.util.Optional;
4   import java.util.function.Consumer;
5   import java.util.function.Supplier;
6   
7   import static java.util.Objects.requireNonNull;
8   
9   /**
10   * Wrapper for a supplier used to create missing values. Calls the supplied handler with
11   * the elapsed time taken in nanoseconds, and {@link Optional#empty()} means it was was not called.
12   *
13   * @param <V> the value type
14   * @since 1.0.0
15   */
16  public class TimedSupplier<V> implements Supplier<V>, AutoCloseable {
17      private final Supplier<? extends V> delegate;
18      private final Consumer<Optional<Long>> handler;
19  
20      private Optional<Long> elapsedDuration = Optional.empty();
21  
22      public TimedSupplier(Supplier<V> delegate, Consumer<Optional<Long>> handler) {
23          this.delegate = requireNonNull(delegate);
24          this.handler = requireNonNull(handler);
25      }
26  
27      @Override
28      public V get() {
29          try (ElapsedTimer ignored = new ElapsedTimer(t -> elapsedDuration = Optional.of(t))) {
30              return delegate.get();
31          }
32      }
33  
34      @Override
35      public void close() {
36          handler.accept(elapsedDuration);
37      }
38  }