package domain enum class Animals(symbol: String) : ItemClass { ZEBRA("šŸ¦“"), OCTOPUS("šŸ™"), GOAT("🐐"), SLOTH("🦄"), DOG("šŸ•"), SNAIL("🐌"), ANT("🐜"); override val symbols: Array = arrayOf(symbol) override val companion get() = Animals companion object : ItemClassCompanion { override val items: List = entries } } enum class Nationality(symbol: String) : ItemClass { ENGLAND("šŸ‡¬šŸ‡§"), UKRAINE("šŸ‡ŗšŸ‡¦"), SPAIN("šŸ‡ŖšŸ‡ø"), NORWAY("šŸ‡³šŸ‡“"), JAPAN("šŸ‡ÆšŸ‡µ"), SWITZERLAND("šŸ‡ØšŸ‡­"), CANADA("šŸ‡ØšŸ‡¦"); override val symbols: Array = arrayOf(symbol) override val companion get() = Nationality companion object : ItemClassCompanion { override val items: List = entries } } enum class Drink(symbol: String) : ItemClass { MILK("šŸ„›"), WINE("šŸ·"), COCKTAIL("šŸø"), COFFEE("ā˜•"), TEA("šŸµ"), BEER("šŸŗ"), BEVERAGE("🧃"); override val symbols: Array = arrayOf(symbol) override val companion get() = Drink companion object : ItemClassCompanion { override val items: List = entries } } enum class Profession(symbol: String) : ItemClass { ASTRONAUT("\u200D\uD83D\uDE80"), HEALTH_WORKER("\u200Dāš•\uFE0F"), FARMER("\u200D\uD83C\uDF3E"), ROCK_STAR("\u200D\uD83C\uDFA4"), SCIENTIST("\u200D\uD83D\uDD2C"), SOFTWARE_DEV("\u200D\uD83D\uDCBB"), FIREFIGHTER("\u200D\uD83D\uDE92"), TEACHER("\u200D\uD83C\uDFEB"); override val symbols: Array = idic(symbol) override val companion get() = Profession companion object : ItemClassCompanion { override val items: List = entries } } enum class Fruit(symbol: String) : ItemClass { GRAPES("šŸ‡"), WATERMELON("šŸ‰"), LEMON("šŸ‹"), BANANA("šŸŒ"), PINEAPPLE("šŸ"), CHERRIES("šŸ’"), STRAWBERRY("šŸ“"), KIWI("šŸ„"), PEAR("šŸ"), MANGO("🄭"); override val symbols: Array = arrayOf(symbol) override val companion get() = Fruit companion object : ItemClassCompanion { override val items: List = entries } } enum class Dessert(symbol: String) : ItemClass { ICE_CREAM("šŸØ"), DOUGHNUT("šŸ©"), COOKIE("šŸŖ"), CAKE("šŸ°"), CUPCAKE("🧁"), PIE("🄧"), CHOCOLATE("šŸ«"), LOLLIPOP("šŸ­"), CUSTARD("šŸ®"); override val symbols: Array = arrayOf(symbol) override val companion get() = Dessert companion object : ItemClassCompanion { override val items: List = entries } } enum class Transportation(symbol: String) : ItemClass { BICYCLE("🚲"), MOTOR_SCOOTER("šŸ›µ"), SKATEBOARD("šŸ›¹"), TAXI("šŸš•"), LOCOMOTIVE("šŸš‚"), TRAM_CAR("šŸš‹"), BUS("🚌"); override val symbols: Array = arrayOf(symbol) override val companion get() = Transportation companion object : ItemClassCompanion { override val items: List = entries } } private val GENDERS = arrayOf("\uD83E\uDDD1", "\uD83D\uDC68", "\uD83D\uDC69") private val SKIN_TONES = arrayOf("\uD83C\uDFFB", "\uD83C\uDFFC", "\uD83C\uDFFD", "\uD83C\uDFFE", "\uD83C\uDFFF") private fun idic(symbol: String): Array = Array(GENDERS.size * SKIN_TONES.size) { i -> val g = GENDERS[i % GENDERS.size] val t = SKIN_TONES[i / GENDERS.size] g + t + symbol } sealed interface ItemClass> { val symbols: Array val companion: ItemClassCompanion companion object { val classes: List> = listOf( Animals, Nationality, Drink, Profession, Fruit, Dessert, Transportation ) fun randomClasses(n: Int): List> { return classes.shuffled().take(n) } } } sealed interface ItemClassCompanion> { val items: List fun randomItems(n: Int): List { return items.shuffled().take(n) } }