Last active
October 4, 2021 20:42
-
-
Save fwgreen/ec84da0ad4ec255cd1f49ccd6d47bead to your computer and use it in GitHub Desktop.
More powerful Enums based on ADTs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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