Skip to content

Instantly share code, notes, and snippets.

@fwgreen
Last active October 4, 2021 20:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fwgreen/ec84da0ad4ec255cd1f49ccd6d47bead to your computer and use it in GitHub Desktop.
Save fwgreen/ec84da0ad4ec255cd1f49ccd6d47bead to your computer and use it in GitHub Desktop.
More powerful Enums based on ADTs
enum Suit(String symbol) {
Hearts("♡"), Clubs("♣"), Spades("♠"), Diamonds("♢");
}
//the above generates...
sealed interface Suit permits Hearts, Clubs, Spades, Diamonds {
String symbol();
}
record Hearts() implements Suit {
@Override
public String symbol() {
return "♡";
}
}
record Clubs() implements Suit {
@Override
public String symbol() {
return "♣";
}
}
record Spades() implements Suit {
@Override
public String symbol() {
return "♠";
}
}
record Diamonds() implements Suit {
@Override
public String symbol() {
return "♢";
}
}
//slightly more complicated...
enum Rank(int value) {
Ace(1), Two(2), Three(3), Four(4), Five(5), Six(6), Seven(7), Eight(8), Nine(9), Ten(10), Jack(11), Queen(12), King(13);
@Override
String toString() {
return switch(this) {
case Ace -> "one";
case Two -> "two";
case Three -> "three";
case Four -> "four";
case Five -> "five";
case Six -> "six";
case Seven -> "seven";
case Eight -> "eight";
case Nine -> "nine";
case Ten -> "ten";
case Jack -> "jack";
case Queen -> "queen";
case King -> "king";
};
}
}
//the above generates...
interface Rank permits Ace, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King {
int value();
}
record Ace() implements Rank {
@Override
public int value() {
return 1;
}
@Override
public String toString() {
return "ace";
}
}
record Two() implements Rank {
@Override
public int value() {
return 2;
}
@Override
public String toString() {
return "two";
}
}
record Three() implements Rank {
@Override
public int value() {
return 3;
}
@Override
public String toString() {
return "three";
}
}
record Four() implements Rank {
@Override
public int value() {
return 4;
}
@Override
public String toString() {
return "four";
}
}
record Five() implements Rank {
@Override
public int value() {
return 5;
}
@Override
public String toString() {
return "five";
}
}
record Six() implements Rank {
@Override
public int value() {
return 6;
}
@Override
public String toString() {
return "six";
}
}
record Seven() implements Rank {
@Override
public int value() {
return 7;
}
@Override
public String toString() {
return "seven";
}
}
record Eight() implements Rank {
@Override
public int value() {
return 8;
}
@Override
public String toString() {
return "eight";
}
}
record Nine() implements Rank {
@Override
public int value() {
return 9;
}
@Override
public String toString() {
return "nine";
}
}
record Ten() implements Rank {
@Override
public int value() {
return 10;
}
@Override
public String toString() {
return "ten";
}
}
record Jack() implements Rank {
@Override
public int value() {
return 11;
}
@Override
public String toString() {
return "jack";
}
}
record Queen() implements Rank {
@Override
public int value() {
return 12;
}
@Override
public String toString() {
return "queen";
}
}
record King() implements Rank {
@Override
public int value() {
return 13;
}
@Override
public String toString() {
return "king";
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment