LazyRef.java

package swingtree;

import org.jspecify.annotations.Nullable;

import java.util.function.Supplier;

/**
 * 	This will simply fetch a variable from a lambda once and then continuously
 * 	return this one value.
 * 	In a sense it is a lazy pass by value!
 *
 * @param <V> The value type parameter of the thing wrapped by this.
 */
final class LazyRef<V>
{
	public static <V> LazyRef<V> of(Supplier<V> source) { return new LazyRef<>(source); }

	private @Nullable Supplier<V> source;
	private @Nullable V variable = null;

	private LazyRef(Supplier<V> source) { this.source = source; }

	public @Nullable V get() {
		if ( this.source == null ) return this.variable;
		else {
			this.variable = this.source.get();
			this.source = null;
		}
		return this.variable;
	}

	@Override public String toString() { return String.valueOf(this.get()); }
}