DefaultBattleSessionEventPublisher.kt

package io.github.lishangbu.avalon.game.battle.engine.core.session

/**
 * 默认 battle session 事件发布器。
 *
 * @property projectors 按顺序执行的 projector 集合。
 */
class DefaultBattleSessionEventPublisher(
    projectors: List<BattleSessionProjector>,
) : BattleSessionEventPublisher {
    private val projectors: List<BattleSessionProjector> = projectors.sortedBy(BattleSessionProjector::order)

    /**
     * 把一条 session 内部事件发布给全部 projector。
     */
    override fun publish(
        session: BattleSession,
        publication: BattleSessionPublication,
    ) {
        projectors.forEach { projector ->
            projector.project(session, publication)
        }
    }
}