WalletEvents, snapshotBalance: Money = Money.zero(Money.JPY) // イベント列が長大なときのショートカット! ) extends Wallet { // イベントから最新状態を導出( しかも、状態をlazy loading できるとは!) override lazy val balance: Money = { events.foldLeft(snapshotBalance) { case (r, MoneyDeposited(_, _, _, _, _, money, _)) => r.plus(money) case (r, MoneyPaid(_, _, _, _, _, money, _, _)) => r.minus(money) case (r, MoneyPaymentReceived(_, _, _, _, _, money, _, _)) => r.plus(money) case (r, _) => r } } } QRS+ES( 再) 入門 突撃!! 隣のアーキテクチャ 22 / 38