make it a little more efficient

This commit is contained in:
Henry Hiles 2026-05-21 12:26:41 -04:00
commit 13c2a4062b
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
2 changed files with 17 additions and 14 deletions

View file

@ -88,7 +88,7 @@ class RoomChatController extends AsyncNotifier<IList<Event>> {
), ),
); );
await ref ref
.watch(RoomsController.provider.notifier) .watch(RoomsController.provider.notifier)
.update( .update(
IMap({ IMap({

View file

@ -1,3 +1,5 @@
import "dart:isolate";
import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:fast_immutable_collections/fast_immutable_collections.dart";
import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:nexus/models/event.dart"; import "package:nexus/models/event.dart";
@ -12,7 +14,7 @@ class RoomsController extends Notifier<IMap<String, Room>> {
String roomId, String roomId,
IList<Event> state, { IList<Event> state, {
bool isMembers = false, bool isMembers = false,
}) => update( }) async => update(
{ {
roomId: Room( roomId: Room(
events: IMap.fromEntries( events: IMap.fromEntries(
@ -20,24 +22,25 @@ class RoomsController extends Notifier<IMap<String, Room>> {
), ),
hasFetchedState: true, hasFetchedState: true,
hasFetchedMembers: isMembers, hasFetchedMembers: isMembers,
state: state.fold( state: await Isolate.run(() {
const IMap.empty(), final newState = state.fold(
const IMap<String, IMap<String, int>>.empty(),
(previousValue, stateEvent) => previousValue.add( (previousValue, stateEvent) => previousValue.add(
stateEvent.type, stateEvent.type,
(previousValue[stateEvent.type] ?? const IMap.empty()).addAll( (previousValue[stateEvent.type] ?? const IMap.empty()).add(
IMap({ stateEvent.stateKey!,
if (stateEvent.stateKey != null) stateEvent.rowId,
stateEvent.stateKey!: stateEvent.rowId, ),
),
);
return newState;
}), }),
), ),
),
),
),
}.toIMap(), }.toIMap(),
const ISet.empty(), const ISet.empty(),
); );
Future<void> update(IMap<String, Room> rooms, ISet<String> leftRooms) async { void update(IMap<String, Room> rooms, ISet<String> leftRooms) {
final merged = rooms.entries.fold(state, (acc, entry) { final merged = rooms.entries.fold(state, (acc, entry) {
final roomId = entry.key; final roomId = entry.key;
final incoming = entry.value; final incoming = entry.value;