public class BedahRecord {

    record Titik(int x, int y) { }
    record Garis(Titik awal, Titik akhir) { }
    record Segitiga(Titik a, Titik b, Titik c) { }

    static void deskripsi(Object bentuk) {
        String teks = switch (bentuk) {
            // Record pattern bersarang: komponen dibedah sampai level Titik.
            case Garis(Titik awal, Titik akhir) ->
                    "garis dari " + awal + " ke " + akhir;
            case Segitiga(Titik(var ax, var ay), Titik b, Titik c) ->
                    "segitiga puncak (" + ax + "," + ay + "), kaki " + b + " dan " + c;
            default -> "bentuk lain";
        };
        System.out.println(teks);
    }

    static int panjangProyeksiX(Garis g) {
        // Record pattern pada instanceof: komponen terbuka tanpa accessor.
        if (g instanceof Garis(Titik(var x1, var y1), Titik(var x2, var y2))) {
            return Math.abs(x2 - x1);
        }
        return 0;
    }

    public static void main(String[] args) {
        deskripsi(new Garis(new Titik(1, 2), new Titik(8, 6)));
        deskripsi(new Segitiga(new Titik(0, 6), new Titik(0, 0), new Titik(4, 0)));
        deskripsi("cukup");

        Garis g = new Garis(new Titik(3, 5), new Titik(9, 5));
        System.out.println("proyeksi-X: " + panjangProyeksiX(g));
    }
}
