public static <T> ExpiringSwingTimer get(Supplier<T> supplier, int expireMs,
			Consumer<T> consumer) {

		// Note: we could let the client specify the delay, but that would add an extra argument
		//       to this method. For now, just use something reasonable.
		int delay = 250;
		BooleanSupplier isReady = () -> {
			T t = supplier.get();
			if (t == null) {
				return false;
			}

			consumer.accept(t);
			return true;
		};
		Runnable dummy = Dummy.runnable();
		ExpiringSwingTimer timer = new ExpiringSwingTimer(delay, expireMs, isReady, dummy);
		timer.start();
		return timer;
	}
Calls the given consumer with the non-null value returned from the given supplier.  The
returned timer will be running.

<p>Once the timer has performed the work, any calls to start the returned timer will
not perform any work.  You can check {@link #didRun()} to see if the work has been completed.

@param <T> the type used by the supplier and consumer
@param supplier the supplier of the desired value
@param expireMs the amount of time past which the code will not be run
@param consumer the consumer to be called with the supplier's value
@return the timer object that is running, which will execute the given code when ready
Ghidra/Framework/Generic/src/main/java/generic/timer/ExpiringSwingTimer.java