package com.airlock.iam.base.infrastructure.provider;

import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.inject.Provider;

public final class CachingDelegationProvider<T> implements Provider<T> {
   private final Provider<T> delegate;
   private T result;

   private CachingDelegationProvider(Provider<T> delegate) {
      this.delegate = delegate;
   }

   @SuppressFBWarnings("IS2_INCONSISTENT_SYNC")
   public T get() {
      if (this.result == null) {
         this.invokeDelegate();
      }

      return this.result;
   }

   private synchronized void invokeDelegate() {
      if (this.result == null) {
         this.result = (T)this.delegate.get();
      }
   }

   public static <T> CachingDelegationProvider<T> of(Provider<T> delegate) {
      return new CachingDelegationProvider<>(delegate);
   }
}
