import scala.collection.mutable.HashMap

object Main {
  trait Target { }

  trait PushEventContext[EventType] {
    def getEvent: EventType
  }
  trait PushNode[EventType] { }
  trait DerivedPushNode[EventType] extends PushNode[EventType] { }

  trait HandlerBase[EventType] {
    def onEvent(target: Target,
                event: EventType,
                node: PushNode[EventType],
                ctx: PushEventContext[EventType]): Unit
                                            }
  val handlers = new HashMap[DerivedPushNode[_], HandlerBase[_]]

  object TimerPushService {
    private val INSTANCE: TimerPushService = new TimerPushService
    def get: TimerPushService = INSTANCE
  }

  class TimerPushService {
    def add[EventType](node: DerivedPushNode[EventType],
                       context: PushEventContext[EventType]): Unit = {}

    def pollEvents[EventType](node: DerivedPushNode[EventType]): List[PushEventContext[EventType]] =
      Nil
  }

  def onTimer(target: Target): Unit = {
    val pushService = TimerPushService.get
    for ((node, handler) <- handlers) {
      for (ctx <- pushService.pollEvents(node)) {
        handler.onEvent(target, ctx.getEvent, node, ctx)
      }
    }
  }
}
