もしランダムアクセスが少なくて探索回数が多いという話なら、 last_modifier: Map<StateKind, Option<EventId>> みたいなのを用意しとけば大体のコストは吸収できるだろうし、 seek 時の検索コストくらいは全体的には無視できそう
None が入っているときは検索をかけて、あとはシーク時に map をリセットすればいい
last_modifier はイベントを処理するごとに更新する前提です (念のため)
あるいはもっと思い切るなら、シーク時に Map<StateKind, EventId> を構築してしまえば、あとは順次再生している段階での検索コストはほぼゼロ
シークに多少時間かかってもよくない? の感覚を許容できるならの話だけど