Created
June 28, 2018 05:40
-
-
Save Hc747/c1ce3455ad328a305b1885b0e5f7cda5 to your computer and use it in GitHub Desktop.
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
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