Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions packages/genui/lib/src/functions/format_string.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,13 @@

import 'package:json_schema_builder/json_schema_builder.dart';
import 'package:meta/meta.dart';
import 'package:rxdart/rxdart.dart';
import 'package:stream_transform/stream_transform.dart';

import '../model/client_function.dart' as cf;
import '../model/data_model.dart';
import '../primitives/logging.dart';
import '../primitives/simple_items.dart';
import '../utils/stream_extensions.dart';

/// Formats a value as a string.
class FormatStringFunction implements cf.ClientFunction {
Expand Down Expand Up @@ -173,7 +174,7 @@ class ExpressionParser {
return Stream<Object?>.value(val);
}).toList();

return CombineLatestStream.list(streams).switchMap((List<Object?> values) {
return streams.combineLatestAll().switchMap((List<Object?> values) {
final Map<String, Object?> combinedArgs = {};
for (var i = 0; i < keys.length; i++) {
combinedArgs[keys[i]] = values[i];
Expand Down Expand Up @@ -249,7 +250,7 @@ class ExpressionParser {
return Stream<Object?>.value(part);
}).toList();

return CombineLatestStream.list(streams).map((List<Object?> values) {
return streams.combineLatestAll().map((List<Object?> values) {
return values.map((e) => e?.toString() ?? '').join('');
});
}
Expand Down
5 changes: 3 additions & 2 deletions packages/genui/lib/src/model/data_model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,11 @@ import 'dart:async';
import 'dart:convert';

import 'package:flutter/foundation.dart';
import 'package:rxdart/rxdart.dart';
import 'package:stream_transform/stream_transform.dart';

import '../primitives/logging.dart';
import '../primitives/simple_items.dart';
import '../utils/stream_extensions.dart';
import 'client_function.dart' as cf;

import 'data_path.dart';
Expand Down Expand Up @@ -155,7 +156,7 @@ class DataContext implements cf.ExecutionContext {

final Stream<List<Object?>> combinedStream = streams.isEmpty
? Stream.value([])
: CombineLatestStream.list(streams);
: streams.combineLatestAll();

return combinedStream.switchMap((List<Object?> values) {
final Map<String, Object?> combinedArgs = {};
Expand Down
19 changes: 19 additions & 0 deletions packages/genui/lib/src/utils/stream_extensions.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// Copyright 2025 The Flutter Authors.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:stream_transform/stream_transform.dart';

/// Extensions for [Iterable] of [Stream]s.
extension CombineLatestAll<T> on Iterable<Stream<T>> {
/// Combines all streams in this iterable into a single stream that emits a
/// list of the latest values from each stream.
///
/// The resulting stream will not emit until every stream in the iterable has
/// emitted at least one value.
Stream<List<T>> combineLatestAll() {
if (isEmpty) return Stream.value([]);

return first.combineLatestAll(skip(1));
}
}
5 changes: 2 additions & 3 deletions packages/genui/lib/src/utils/validation_helper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,10 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:rxdart/rxdart.dart';

import '../model/data_model.dart';
import '../primitives/simple_items.dart';
import '../widgets/widget_utilities.dart';
import 'stream_extensions.dart';

/// A validation error with a message.
class ValidationError {
Expand Down Expand Up @@ -47,7 +46,7 @@ class ValidationHelper {
);
}

return CombineLatestStream.list(streams).map((results) {
return streams.combineLatestAll().map((results) {
for (final (isValid, msg) in results) {
if (!isValid) return msg;
}
Expand Down
2 changes: 1 addition & 1 deletion packages/genui/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ dependencies:
json_schema_builder: ^0.1.3
logging: ^1.3.0
meta: ^1.17.0
rxdart: ^0.28.0
stream_transform: ^2.1.1
url_launcher: ^6.3.2
uuid: ^4.4.0

Expand Down
Loading