From 34e6c07d8d33a472ffe3c8b6a230a1cda310013e Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Thu, 21 May 2026 12:16:01 -0400 Subject: [PATCH 1/3] temp isolate --- lib/controllers/rooms_controller.dart | 28 +++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/lib/controllers/rooms_controller.dart b/lib/controllers/rooms_controller.dart index 55a0d2b..bcee62d 100644 --- a/lib/controllers/rooms_controller.dart +++ b/lib/controllers/rooms_controller.dart @@ -1,3 +1,5 @@ +import "dart:isolate"; + import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:nexus/models/event.dart"; @@ -38,7 +40,11 @@ class RoomsController extends Notifier> { ); Future update(IMap rooms, ISet leftRooms) async { - final merged = rooms.entries.fold(state, (acc, entry) { + final merged = await rooms.entries.fold(Future.sync(() => state), ( + accF, + entry, + ) async { + final acc = await accF; final roomId = entry.key; final incoming = entry.value; final existing = acc[roomId]; @@ -51,15 +57,18 @@ class RoomsController extends Notifier> { events: incoming.events.isEmpty ? existing.events : existing.events.addAll(incoming.events), - state: incoming.state.entries.fold( - existing.state, - (previousValue, event) => previousValue.add( - event.key, - (previousValue[event.key] ?? const IMap.empty()).addAll( - event.value, + state: await Isolate.run(() { + final state = incoming.state.entries.fold( + existing.state, + (previousValue, event) => previousValue.add( + event.key, + (previousValue[event.key] ?? const IMap.empty()).addAll( + event.value, + ), ), - ), - ), + ); + return state; + }), reset: false, hasFetchedMembers: incoming.hasFetchedMembers || existing.hasFetchedMembers, @@ -86,7 +95,6 @@ class RoomsController extends Notifier> { merged, (acc, roomId) => acc.remove(roomId), ); - state = prunedList; } From 57cfad9f45b60c5f7bbe3d3c286a3694d0580793 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Thu, 21 May 2026 12:16:07 -0400 Subject: [PATCH 2/3] Revert "temp isolate" This reverts commit 34e6c07d8d33a472ffe3c8b6a230a1cda310013e. --- lib/controllers/rooms_controller.dart | 28 ++++++++++----------------- 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/lib/controllers/rooms_controller.dart b/lib/controllers/rooms_controller.dart index bcee62d..55a0d2b 100644 --- a/lib/controllers/rooms_controller.dart +++ b/lib/controllers/rooms_controller.dart @@ -1,5 +1,3 @@ -import "dart:isolate"; - import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:nexus/models/event.dart"; @@ -40,11 +38,7 @@ class RoomsController extends Notifier> { ); Future update(IMap rooms, ISet leftRooms) async { - final merged = await rooms.entries.fold(Future.sync(() => state), ( - accF, - entry, - ) async { - final acc = await accF; + final merged = rooms.entries.fold(state, (acc, entry) { final roomId = entry.key; final incoming = entry.value; final existing = acc[roomId]; @@ -57,18 +51,15 @@ class RoomsController extends Notifier> { events: incoming.events.isEmpty ? existing.events : existing.events.addAll(incoming.events), - state: await Isolate.run(() { - final state = incoming.state.entries.fold( - existing.state, - (previousValue, event) => previousValue.add( - event.key, - (previousValue[event.key] ?? const IMap.empty()).addAll( - event.value, - ), + state: incoming.state.entries.fold( + existing.state, + (previousValue, event) => previousValue.add( + event.key, + (previousValue[event.key] ?? const IMap.empty()).addAll( + event.value, ), - ); - return state; - }), + ), + ), reset: false, hasFetchedMembers: incoming.hasFetchedMembers || existing.hasFetchedMembers, @@ -95,6 +86,7 @@ class RoomsController extends Notifier> { merged, (acc, roomId) => acc.remove(roomId), ); + state = prunedList; } From 13c2a4062b8be2ec802ac5e485128cc8f3478b36 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Thu, 21 May 2026 12:26:41 -0400 Subject: [PATCH 3/3] make it a little more efficient --- lib/controllers/room_chat_controller.dart | 2 +- lib/controllers/rooms_controller.dart | 29 +++++++++++++---------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/lib/controllers/room_chat_controller.dart b/lib/controllers/room_chat_controller.dart index 4412b2d..1f0fe2c 100644 --- a/lib/controllers/room_chat_controller.dart +++ b/lib/controllers/room_chat_controller.dart @@ -88,7 +88,7 @@ class RoomChatController extends AsyncNotifier> { ), ); - await ref + ref .watch(RoomsController.provider.notifier) .update( IMap({ diff --git a/lib/controllers/rooms_controller.dart b/lib/controllers/rooms_controller.dart index 55a0d2b..382fac4 100644 --- a/lib/controllers/rooms_controller.dart +++ b/lib/controllers/rooms_controller.dart @@ -1,3 +1,5 @@ +import "dart:isolate"; + import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:nexus/models/event.dart"; @@ -12,7 +14,7 @@ class RoomsController extends Notifier> { String roomId, IList state, { bool isMembers = false, - }) => update( + }) async => update( { roomId: Room( events: IMap.fromEntries( @@ -20,24 +22,25 @@ class RoomsController extends Notifier> { ), hasFetchedState: true, hasFetchedMembers: isMembers, - state: state.fold( - const IMap.empty(), - (previousValue, stateEvent) => previousValue.add( - stateEvent.type, - (previousValue[stateEvent.type] ?? const IMap.empty()).addAll( - IMap({ - if (stateEvent.stateKey != null) - stateEvent.stateKey!: stateEvent.rowId, - }), + state: await Isolate.run(() { + final newState = state.fold( + const IMap>.empty(), + (previousValue, stateEvent) => previousValue.add( + stateEvent.type, + (previousValue[stateEvent.type] ?? const IMap.empty()).add( + stateEvent.stateKey!, + stateEvent.rowId, + ), ), - ), - ), + ); + return newState; + }), ), }.toIMap(), const ISet.empty(), ); - Future update(IMap rooms, ISet leftRooms) async { + void update(IMap rooms, ISet leftRooms) { final merged = rooms.entries.fold(state, (acc, entry) { final roomId = entry.key; final incoming = entry.value;