Skip to content

Instantly share code, notes, and snippets.

@Hc747
Created June 28, 2018 05:40
Show Gist options
  • Save Hc747/c1ce3455ad328a305b1885b0e5f7cda5 to your computer and use it in GitHub Desktop.
Save Hc747/c1ce3455ad328a305b1885b0e5f7cda5 to your computer and use it in GitHub Desktop.
interface Entity
class Player(val name: String) : Entity {
fun say(message: String) = println("$name: $message")
}
class NPC(val type: String) : Entity
enum class EventKey {
INIT,
PROCESS,
FINISH
}
typealias Event<T> = (T) -> Unit
class EntityModule<T : Entity>(private val entity: T) {
private val events = EnumMap<EventKey, MutableList<Event<T>>>(EventKey::class.java)
fun process(key: EventKey) {
val handlers = events[key] ?: return
handlers.forEach { it.invoke(entity) }
}
fun register(key: EventKey, event: Event<T>) {
val handlers = events[key] ?: mutableListOf()
handlers.add(event)
events[key] = handlers
}
fun deregister(key: EventKey, event: Event<T>) {
val handlers = events[key] ?: return
handlers.remove(event)
if (handlers.isEmpty()) {
events.remove(key)
}
}
}
object Main {
@JvmStatic
fun main(args: Array<String>) {
val player = Player("Hc747")
val module = EntityModule(player)
with(module) {
register(EventKey.INIT, Greeter::greet)
register(EventKey.INIT, AppearanceInitialiser)
register(EventKey.PROCESS) { it.say("I am currently processing!") }
register(EventKey.FINISH, Greeter::farewell)
register(EventKey.FINISH, DatabaseSerialiser())
}
module.process(EventKey.INIT)
for (i in 1 .. 3) {
module.process(EventKey.PROCESS)
}
module.process(EventKey.FINISH)
}
}
object Greeter {
fun greet(player: Player) {
player.say("Welcome to RuneScape.")
}
fun farewell(player: Player) {
player.say("Goodbye!")
}
}
object AppearanceInitialiser : Event<Player> {
override fun invoke(entity: Player) {
//business logic here
entity.say("Appearance initialised.")
}
}
class DatabaseSerialiser : Event<Player> {
override fun invoke(player: Player) {
player.say("Saved to database!")
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment