class DnsRecord {
    String recordType;
    String domainName;
    String cnameAlias;
    IpAddr recordIp;
    int ttl;
}if(record.recordType.equals("CNAME")) {
    // should not be null
    record.cnameAlias;
} else if(record.recordType.equals("A")) {
    // should not be null
    record.recordIp;
} else {
    // ???
}switch() {
  //...
  case default:
    throw new RuntimeException(
      "This should not happen lol"
    );
}a * b(Bool * Bool)2 * 2 = 4Pending | Accepted | RejectedStatus + Bool3 + 2 = 5  CnameRecord ( ttl, name, alias )
| ARecord     ( ttl, name, ipv4 address )
| AaaaRecord  ( ttl, name, ipv6 address )
| TxtRecord   ( ttl, name, value )
data DnsRecord =
    CnameRecord Int String String
  | ARecord Int String IpV4
  | AaaaRecord Int String IpV6
  | TxtRecord Int String Stringsealed trait DnsRecord
case class CnameRecord(...)
  extends DnsRecord
case class ARecord(...)
  extends DnsRecord
case class AaaaRecord(...)
  extends DnsRecord
case class TxtRecord(...)
  extends DnsRecordvar adt = require('adt');
var DnsRecord = adt.data({
  CnameRecord: { ttl: adt.only(Number), ... },
  ARecord: { ttl: adt.only(Number), ... },
  AaaaRecord: { ttl: adt.only(Number), ... }
});DnsRecord( ttl, name,
    AValue(ipv4)
  | AaaaValue(ipv6)
  | CnameValue(alias)
  | TxtValue(name)
(a * b + a * c)
 <=>
 a * (b + c)
(a * b) <=> (b * a)
 (a + b) <=> (b + a)
(a * 1) <=> a
 (a + 0) <=> a
(a + b) + c <=> a + (b + c)
 (a * b) * c <=> a * (b * c)
a -> bbac(a * b)cb)a(a, b) -> ca -> b -> c