Абстрагирующая часть Диодного государственного управления
Я пытаюсь абстрагировать часть логики управления состоянием Диода, понимая, что все мои обработчики в некоторой степени похожи в контексте данного приложения.
Я пытаюсь создать общие классы, расширяющие действие Diode, и все они представляют определенный тип действия в приложении. Примерами являются FetchAction, CreateAction, DeleteAction. Все они вводятся с параметром Z, который будет использоваться для дифференциации обработчиков. Вот часть логики:
abstract class BasicHandler[Model, Z <: Map[_, _]](model: ModelRW[Model, Pot[Z]]) extends ActionHandler(model) {
import BasicHandler._
private def defaultHandling: PartialFunction[Any, ActionResult[Model]] = {
case action: FetchAction[Z] =>
action.handleWith(this, fetchEffect(action.url))(PotAction.handler[Z, Model, FetchAction[Z]]())
case action: LoadAction[Z] =>
updated(Ready(value.getOrElse(Map.empty) ++ action.load).asInstanceOf[Pot[Z]])
}
...
}
Основной проблемой здесь является стирание типа. Все отправленные действия проходят через FetchAction первого обработчика, объявленного в composeHandlers, полностью игнорируя переданный параметр типа Z. Я безуспешно пытался использовать отражение Scala с TypeTag или ClassTag.
Я чувствую, что с моим подходом что-то принципиально не так. Кто-нибудь когда-нибудь пробовал что-то похожее, или у него есть предложения для достижения вышеизложенного?
Большое спасибо!