import java.util.concurrent.Executors;

public class UpgradeDemo {
    sealed interface Result permits Success, Failure {}
    record Success(String value) implements Result {}
    record Failure(int code) implements Result {}

    static String describe(Result result) {
        return switch (result) {
            case null -> "missing";
            case Success(String value) when !value.isBlank() -> "ok:" + value;
            case Success(var value) -> "empty";
            case Failure(int code) -> "error:" + code;
        };
    }

    public static void main(String[] args) throws Exception {
        Object candidate = new Success("java21");
        if (candidate instanceof Success success) {
            System.out.println("instanceof=" + success.value());
        }
        try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
            var first = executor.submit(() -> {
                Thread.sleep(20); // Simulated wait, not a database request or benchmark.
                return "virtual=" + Thread.currentThread().isVirtual()
                        + ", " + describe((Result) candidate);
            });
            var second = executor.submit(() -> describe(new Failure(503)));
            System.out.println(first.get());
            System.out.println(second.get());
        }
        System.out.println(describe(new Success("")));
        System.out.println(describe(null));
    }
}
