small optimizations

This commit is contained in:
Fabian Freund
2025-03-25 19:48:10 +01:00
parent 9bc9c53559
commit 9ad5f485b9
8 changed files with 42 additions and 29 deletions
+11 -7
View File
@@ -1,26 +1,30 @@
extension NullableX<T extends Object?> on T? { extension NullableX<T extends Object?> on T? {
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
R? mapNotNull<R>(R? Function(T) callback) { R? mapNotNull<R>(R? Function(T) callback) {
// We can simplify this by using the null-aware operator // Already optimized, but can simplify further
return this != null ? callback(this as T) : null; return this == null ? null : callback(this as T);
} }
} }
extension NullableStringX on String? { extension NullableStringX on String? {
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
String? get whenNotEmpty => (this?.isNotEmpty ?? false) ? this : null; String? get whenNotEmpty {
// Avoid double null check
final value = this;
return value != null && value.isNotEmpty ? value : null;
}
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
bool get isNotEmpty => this?.isNotEmpty ?? false; bool get isNotEmpty => this != null && this!.isNotEmpty;
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
bool get isEmpty => this?.isEmpty ?? true; bool get isEmpty => this == null || this!.isEmpty;
} }
extension NullableIterable on Iterable? { extension NullableIterable on Iterable? {
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
bool get isNotEmpty => this?.isNotEmpty ?? false; bool get isNotEmpty => this != null && this!.isNotEmpty;
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
bool get isEmpty => this?.isEmpty ?? true; bool get isEmpty => this == null || this!.isEmpty;
} }
@@ -136,7 +136,7 @@ class EngineReadyState extends _$EngineReadyState {
eventService.engineReadyStateEvents eventService.engineReadyStateEvents
.firstWhere((value) => value == true) .firstWhere((value) => value == true)
.timeout( .timeout(
const Duration(seconds: 5), const Duration(seconds: 3),
onTimeout: () { onTimeout: () {
logger.w('Waiting for engine ready state timed out'); logger.w('Waiting for engine ready state timed out');
return true; return true;
@@ -96,7 +96,7 @@ final engineSuggestionsServiceProvider =
@Deprecated('Will be removed in 3.0. Use Ref instead') @Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element // ignore: unused_element
typedef EngineSuggestionsServiceRef = ProviderRef<GeckoSuggestionsService>; typedef EngineSuggestionsServiceRef = ProviderRef<GeckoSuggestionsService>;
String _$engineReadyStateHash() => r'c682333e2e07cf0635aa7ae793a2088ca648c950'; String _$engineReadyStateHash() => r'a892c48ffc29e3414de12e66d9bfec522e4f40a8';
/// See also [EngineReadyState]. /// See also [EngineReadyState].
@ProviderFor(EngineReadyState) @ProviderFor(EngineReadyState)
@@ -268,7 +268,7 @@ class TabRepository extends _$TabRepository {
}); });
}); });
ref.listen(intentStreamProvider, (previous, next) { ref.listen(engineBoundIntentStreamProvider, (previous, next) {
next.whenData((value) async { next.whenData((value) async {
switch (value) { switch (value) {
case SharedUrl(): case SharedUrl():
@@ -6,7 +6,7 @@ part of 'tab.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$tabRepositoryHash() => r'9bdd6ddc0254c830b783eb2a987d98d4f1d313fb'; String _$tabRepositoryHash() => r'a7f1112a2404b0be96be44b6c1763aa5cc931e5b';
/// See also [TabRepository]. /// See also [TabRepository].
@ProviderFor(TabRepository) @ProviderFor(TabRepository)
@@ -3,6 +3,7 @@ import 'dart:async';
import 'package:lensai/data/models/received_intent_parameter.dart'; import 'package:lensai/data/models/received_intent_parameter.dart';
import 'package:lensai/extensions/nullable.dart'; import 'package:lensai/extensions/nullable.dart';
import 'package:lensai/features/app_widget/domain/services/home_widget.dart'; import 'package:lensai/features/app_widget/domain/services/home_widget.dart';
import 'package:lensai/features/geckoview/domain/providers.dart';
import 'package:lensai/features/share_intent/domain/entities/shared_content.dart'; import 'package:lensai/features/share_intent/domain/entities/shared_content.dart';
import 'package:lensai/features/share_intent/domain/services/sharing_intent.dart'; import 'package:lensai/features/share_intent/domain/services/sharing_intent.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
@@ -24,7 +25,7 @@ final _contentParserTransformer =
); );
@Riverpod() @Riverpod()
class IntentStream extends _$IntentStream { class EngineBoundIntentStream extends _$EngineBoundIntentStream {
late StreamController<SharedContent> _streamController; late StreamController<SharedContent> _streamController;
@override @override
@@ -34,6 +35,11 @@ class IntentStream extends _$IntentStream {
await _streamController.close(); await _streamController.close();
}); });
final engineReady = ref.watch(engineReadyStateProvider);
if (!engineReady) {
return const Stream.empty();
}
final sharingItentStream = ref.watch(sharingIntentStreamProvider); final sharingItentStream = ref.watch(sharingIntentStreamProvider);
final appWidgetLaunchStream = ref.watch(appWidgetLaunchStreamProvider); final appWidgetLaunchStream = ref.watch(appWidgetLaunchStreamProvider);
@@ -6,22 +6,25 @@ part of 'intent.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$intentStreamHash() => r'e78268ec703cd0d1f08d41b9e10a487e6000b7da'; String _$engineBoundIntentStreamHash() =>
r'860e39a7b608d579f7383e2199719067ad26f268';
/// See also [IntentStream]. /// See also [EngineBoundIntentStream].
@ProviderFor(IntentStream) @ProviderFor(EngineBoundIntentStream)
final intentStreamProvider = final engineBoundIntentStreamProvider = AutoDisposeStreamNotifierProvider<
AutoDisposeStreamNotifierProvider<IntentStream, SharedContent>.internal( EngineBoundIntentStream,
IntentStream.new, SharedContent
name: r'intentStreamProvider', >.internal(
debugGetCreateSourceHash: EngineBoundIntentStream.new,
const bool.fromEnvironment('dart.vm.product') name: r'engineBoundIntentStreamProvider',
? null debugGetCreateSourceHash:
: _$intentStreamHash, const bool.fromEnvironment('dart.vm.product')
dependencies: null, ? null
allTransitiveDependencies: null, : _$engineBoundIntentStreamHash,
); dependencies: null,
allTransitiveDependencies: null,
);
typedef _$IntentStream = AutoDisposeStreamNotifier<SharedContent>; typedef _$EngineBoundIntentStream = AutoDisposeStreamNotifier<SharedContent>;
// ignore_for_file: type=lint // ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
@@ -5,7 +5,7 @@ import 'package:lensai/features/geckoview/features/tabs/features/vector_store/ut
typedef DocumentParts = ({String mainDocumentId, List<Document> parts}); typedef DocumentParts = ({String mainDocumentId, List<Document> parts});
List<Document> mergeShortDocuments( List<Document> _mergeShortDocuments(
List<Document> documents, List<Document> documents,
int maxLength, { int maxLength, {
String separator = '\n', String separator = '\n',
@@ -69,7 +69,7 @@ DocumentParts? splitMarkdownDocument(
} }
final headerKeys = headersToSplitOn.map((header) => header.$2).toSet(); final headerKeys = headersToSplitOn.map((header) => header.$2).toSet();
final mergedDocChunks = mergeShortDocuments( final mergedDocChunks = _mergeShortDocuments(
docChunks, docChunks,
chunkSize, chunkSize,
doMerge: (a, b) { doMerge: (a, b) {