From 6dfbe2dc295bdfcc976c141be2994665c0f1dd0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petrus=20Nguy=E1=BB=85n=20Th=C3=A1i=20H=E1=BB=8Dc?= Date: Tue, 14 Sep 2021 01:46:55 +0700 Subject: [PATCH] 2.0.0 (#15) * 2.0.0 * 2.0.0 * fix CI --- .github/workflows/dart.yml | 6 +- AUTHORS | 1 + CHANGELOG.md | 9 ++ README.md | 10 +- ...inct_value_connectable_stream_example.dart | 2 + lib/src/as_broadcast.dart | 24 +++- .../distinct_value_connectable_stream.dart | 129 ++---------------- lib/src/distinct_value_stream.dart | 108 ++------------- lib/src/distinct_value_stream_mixin.dart | 24 ---- lib/src/distinct_value_subject.dart | 90 +----------- pubspec.yaml | 11 +- ...istinct_value_connectable_stream_test.dart | 2 + test/distinct_value_subject_test.dart | 2 + test/distinct_value_test.dart | 2 + ...single_subscription_to_broadcast_test.dart | 2 + 15 files changed, 83 insertions(+), 339 deletions(-) create mode 100644 AUTHORS delete mode 100644 lib/src/distinct_value_stream_mixin.dart diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index b4d5a3f..d1296db 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest container: - image: google/dart:2.12 + image: google/dart:latest steps: - uses: actions/checkout@v2 @@ -24,7 +24,7 @@ jobs: run: dart analyze --fatal-infos --fatal-warnings - name: Format code - run: dartfmt -n ./lib ./test --set-exit-if-changed + run: dart format . --set-exit-if-changed - name: Active coverage run: pub global activate coverage @@ -41,4 +41,4 @@ jobs: - name: Format coverage run: pub global run coverage:format_coverage --lcov --in=coverage.json --out=lcov.info --packages=.packages --report-on=lib - - uses: codecov/codecov-action@v1 + - uses: codecov/codecov-action@v2.1.0 diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..e17992a --- /dev/null +++ b/AUTHORS @@ -0,0 +1 @@ +Petrus Nguyễn Thái Học \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f50c4c..c7efd3a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +## 2.0.0 - Sep 13, 2021 + +- **DEPRECATED**. This package is now merged into [rxdart_ext](https://pub.dev/packages/rxdart_ext) package. Please use [rxdart_ext](https://pub.dev/packages/rxdart_ext) package for the same purpose, thanks. + - `DistinctValueSubject` -> `StateSubject`. + - `DistinctValueConnectableStream` -> `StateConnectableStream`. + - `publishValueDistinct` -> `publishState`. + - `shareValueDistinct` -> `shareState`. + - `distinctValue` -> `toStateStream`. + ## 1.3.0 - May 9, 2021 - Update `rxdart` to `0.27.0`. diff --git a/README.md b/README.md index 2264a57..10efb3d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # distinct_value_connectable_stream +# **DEPRECATED**. This package is now merged into [rxdart_ext](https://pub.dev/packages/rxdart_ext) package. Please use [rxdart_ext](https://pub.dev/packages/rxdart_ext) package for the same purpose, thanks. + - `Distinct` & `Connectable` & `ValueStream` RxDart Stream. - Useful for flutter `BLoC pattern` - `StreamBuilder`. @@ -59,15 +61,15 @@ [comment]: <> (## Implement BLoC) [comment]: <> ( ### Without using package) - + [comment]: <> (

) [comment]: <> ( ) [comment]: <> (

) - + [comment]: <> ( ### Using package) - + [comment]: <> (

) [comment]: <> ( ) @@ -89,7 +91,7 @@ final distinctState$ = state$.publishValueDistinct(UiState.initial()); distinctState$.connect(); StreamBuilder( - initialData: distinctState$.requireValue, + initialData: distinctState$.value, stream: distinctState$, builder: (context, snapshot) { final UiState state = snapshot.requireData; diff --git a/example/distinct_value_connectable_stream_example.dart b/example/distinct_value_connectable_stream_example.dart index 40c6f7a..5d132cb 100644 --- a/example/distinct_value_connectable_stream_example.dart +++ b/example/distinct_value_connectable_stream_example.dart @@ -1,3 +1,5 @@ +// ignore_for_file: deprecated_member_use_from_same_package + import 'dart:async'; import 'package:distinct_value_connectable_stream/distinct_value_connectable_stream.dart'; diff --git a/lib/src/as_broadcast.dart b/lib/src/as_broadcast.dart index bd4a76d..73ca7c5 100644 --- a/lib/src/as_broadcast.dart +++ b/lib/src/as_broadcast.dart @@ -1,8 +1,11 @@ +// ignore_for_file: deprecated_member_use_from_same_package + import 'dart:async'; +import 'package:rxdart_ext/rxdart_ext.dart'; + import 'distinct_value_connectable_stream.dart'; import 'distinct_value_stream.dart'; -import 'distinct_value_stream_mixin.dart'; /// Convert a [DistinctValueStream] to a broadcast [DistinctValueStream]. extension BroadcastDistinctValueStreamExtensions on DistinctValueStream { @@ -35,7 +38,6 @@ extension BroadcastDistinctValueStreamExtensions on DistinctValueStream { } class _AsBroadcastStream extends StreamView - with DistinctValueStreamMixin implements DistinctValueStream { final DistinctValueStream source; @@ -47,4 +49,22 @@ class _AsBroadcastStream extends StreamView @override T get value => source.value; + + @override + Never get error => throw ValueStreamError.hasNoError(); + + @override + Null get errorOrNull => null; + + @override + bool get hasError => false; + + @override + Null get stackTrace => null; + + @override + bool get hasValue => true; + + @override + T get valueOrNull => value; } diff --git a/lib/src/distinct_value_connectable_stream.dart b/lib/src/distinct_value_connectable_stream.dart index 5f7f42c..2ac0084 100644 --- a/lib/src/distinct_value_connectable_stream.dart +++ b/lib/src/distinct_value_connectable_stream.dart @@ -1,126 +1,18 @@ +// ignore_for_file: deprecated_member_use_from_same_package + import 'dart:async'; -import 'package:meta/meta.dart'; -import 'package:rxdart_ext/rxdart_ext.dart' - show - ConnectableStream, - ConnectableStreamSubscription, - ValueStream, - ValueSubject; +import 'package:rxdart_ext/rxdart_ext.dart'; import 'distinct_value_stream.dart'; -import 'distinct_value_stream_mixin.dart'; -import 'distinct_value_subject.dart'; /// A [ConnectableStream] that converts a single-subscription Stream into /// a broadcast [Stream], and provides synchronous access to the latest emitted value. /// /// This is a combine of [ConnectableStream], [ValueStream], [ValueSubject] and [Stream.distinct]. -@sealed -abstract class DistinctValueConnectableStream extends ConnectableStream - implements DistinctValueStream { - DistinctValueConnectableStream._(Stream stream) : super(stream); - - /// Constructs a [Stream] which only begins emitting events when - /// the [connect] method is called, this [Stream] acts like a - /// [ValueSubject] and distinct until changed. - /// - /// Data events are skipped if they are equal to the previous data event. - /// Equality is determined by the provided [equals] method. If that is omitted, - /// the '==' operator on the last provided data element is used. - factory DistinctValueConnectableStream( - Stream source, - T seedValue, { - bool Function(T previous, T next)? equals, - bool sync = true, - }) => - _DistinctValueConnectableStream._( - source, - DistinctValueSubject(seedValue, sync: sync, equals: equals), - equals, - ); - - @override - DistinctValueStream autoConnect( - {void Function(StreamSubscription subscription)? connection}); - - @override - StreamSubscription connect(); - - @override - DistinctValueStream refCount(); -} - -class _DistinctValueConnectableStream - extends DistinctValueConnectableStream with DistinctValueStreamMixin { - final Stream _source; - final DistinctValueSubject _subject; - var _used = false; - - @override - final bool Function(T, T) equals; - - _DistinctValueConnectableStream._( - this._source, - this._subject, - bool Function(T, T)? equals, - ) : equals = equals ?? DistinctValueStream.defaultEquals, - super._(_subject); - - late final _connection = ConnectableStreamSubscription( - _source.listen( - _subject.add, - onError: null, - onDone: _subject.close, - ), - _subject, - ); - - void _checkUsed() { - if (_used) { - throw StateError('Cannot reuse this stream. This causes many problems.'); - } - _used = true; - } - - @override - DistinctValueStream autoConnect({ - void Function(StreamSubscription subscription)? connection, - }) { - _checkUsed(); - - _subject.onListen = () { - final subscription = _connection; - connection?.call(subscription); - }; - _subject.onCancel = null; - - return this; - } - - @override - StreamSubscription connect() { - _checkUsed(); - - _subject.onListen = _subject.onCancel = null; - return _connection; - } - - @override - DistinctValueStream refCount() { - _checkUsed(); - - ConnectableStreamSubscription? subscription; - - _subject.onListen = () => subscription = _connection; - _subject.onCancel = () => subscription?.cancel(); - - return this; - } - - @override - T get value => _subject.value; -} +@Deprecated( + "Use StateConnectableStream from 'rxdart_ext' package instead. This package is deprecated!") +typedef DistinctValueConnectableStream = StateConnectableStream; /// Provide two extension methods for [Stream]: /// - [publishValueDistinct] @@ -157,13 +49,14 @@ extension DistinctValueConnectableExtensions on Stream { /// // ValueSubject /// subscription.cancel(); /// ``` + @Deprecated( + "Use StateConnectableExtensions.publishState from 'rxdart_ext' package instead. This package is deprecated!") DistinctValueConnectableStream publishValueDistinct( T seedValue, { bool Function(T previous, T next)? equals, bool sync = true, }) => - DistinctValueConnectableStream(this, seedValue, - equals: equals, sync: sync); + publishState(seedValue, equals: equals, sync: sync); /// Convert the this Stream into a new [DistinctValueStream] that can /// be listened to multiple times, providing an initial value. @@ -197,10 +90,12 @@ extension DistinctValueConnectableExtensions on Stream { /// subscription.cancel(); /// subscription2.cancel(); /// ``` + @Deprecated( + "Use StateConnectableExtensions.shareState from 'rxdart_ext' package instead. This package is deprecated!") DistinctValueStream shareValueDistinct( T seedValue, { bool Function(T previous, T next)? equals, bool sync = true, }) => - publishValueDistinct(seedValue, equals: equals, sync: sync).refCount(); + shareState(seedValue, equals: equals, sync: sync); } diff --git a/lib/src/distinct_value_stream.dart b/lib/src/distinct_value_stream.dart index f3c2f2d..4619900 100644 --- a/lib/src/distinct_value_stream.dart +++ b/lib/src/distinct_value_stream.dart @@ -1,41 +1,15 @@ +// ignore_for_file: deprecated_member_use_from_same_package + import 'dart:async'; -import 'package:distinct_value_connectable_stream/src/distinct_value_stream_mixin.dart'; -import 'package:rxdart_ext/rxdart_ext.dart' - show NotReplayValueStream, ValueStreamController; +import 'package:rxdart_ext/rxdart_ext.dart'; /// An [Stream] that provides synchronous access to the last emitted item, /// and two consecutive values are not equal. /// The equality between previous data event and current data event is determined by [equals]. -abstract class DistinctValueStream extends NotReplayValueStream { - /// Determined equality between previous data event and current data event. - bool Function(T, T) get equals; - - /// Default [equals] function. - /// Use '==' operator on the last provided data element. - static bool defaultEquals(Object? lhs, Object? rhs) => lhs == rhs; - - @override - T get value; - - @override - T get valueOrNull; - - @override - bool get hasValue; - - @override - Never get error; - - @override - Null get errorOrNull; - - @override - bool get hasError; - - @override - Null get stackTrace; -} +@Deprecated( + "Use StateStream from 'rxdart_ext' package instead. This package is deprecated!") +typedef DistinctValueStream = StateStream; /// Convert this [Stream] to a [DistinctValueStream]. extension ToDistinctValueStreamExtension on Stream { @@ -49,75 +23,11 @@ extension ToDistinctValueStreamExtension on Stream { /// the '==' operator on the last provided data element is used. /// /// This stream is a single-subscription stream. + @Deprecated( + "Use ToStateStreamExtension.toStateStream from 'rxdart_ext' package instead. This package is deprecated!") DistinctValueStream distinctValue( T value, { bool Function(T p1, T p2)? equals, }) => - _DistinctValueStream( - this, value, equals ?? DistinctValueStream.defaultEquals); -} - -/// Default implementation of [DistinctValueStream]. -/// This stream acts like [Stream.distinct] except it provides seed value -/// used to check for equality, and synchronous access to the last emitted item. -/// -/// Data events are skipped if they are equal to the previous data event. -/// Equality is determined by the provided [equals] method. If that is omitted, -/// the '==' operator on the last provided data element is used. -/// -/// This stream is a single-subscription stream. -class _DistinctValueStream extends Stream - with DistinctValueStreamMixin - implements DistinctValueStream { - @override - final bool Function(T p1, T p2) equals; - - final ValueStreamController controller; - - @override - bool get isBroadcast => false; - - /// Construct a [_DistinctValueStream] with source stream, seed value. - _DistinctValueStream( - Stream source, - T seedValue, - this.equals, - ) : controller = ValueStreamController(seedValue, sync: true) { - late StreamSubscription subscription; - - controller.onListen = () { - subscription = source.listen( - (data) { - if (!equals(value, data)) { - controller.add(data); - } - }, - onError: null, - onDone: controller.close, - ); - - if (!source.isBroadcast) { - controller.onPause = subscription.pause; - controller.onResume = subscription.resume; - } - }; - controller.onCancel = () => subscription.cancel(); - } - - @override - StreamSubscription listen( - void Function(T event)? onData, { - Function? onError, - void Function()? onDone, - bool? cancelOnError, - }) => - controller.stream.listen( - onData, - onError: onError, - onDone: onDone, - cancelOnError: cancelOnError, - ); - - @override - T get value => controller.stream.value; + toStateStream(value, equals: equals); } diff --git a/lib/src/distinct_value_stream_mixin.dart b/lib/src/distinct_value_stream_mixin.dart deleted file mode 100644 index 59faa1a..0000000 --- a/lib/src/distinct_value_stream_mixin.dart +++ /dev/null @@ -1,24 +0,0 @@ -import 'package:rxdart_ext/rxdart_ext.dart' show ValueStreamError; - -import 'distinct_value_stream.dart'; - -/// This mixin implements all [DistinctValueStream] members except [DistinctValueStream.value]. -mixin DistinctValueStreamMixin implements DistinctValueStream { - @override - Never get error => throw ValueStreamError.hasNoError(); - - @override - Null get errorOrNull => null; - - @override - bool get hasError => false; - - @override - Null get stackTrace => null; - - @override - bool get hasValue => true; - - @override - T get valueOrNull => value; -} diff --git a/lib/src/distinct_value_subject.dart b/lib/src/distinct_value_subject.dart index 3285f8b..abb2921 100644 --- a/lib/src/distinct_value_subject.dart +++ b/lib/src/distinct_value_subject.dart @@ -1,9 +1,8 @@ +// ignore_for_file: deprecated_member_use_from_same_package + import 'dart:async'; -import 'package:distinct_value_connectable_stream/src/distinct_value_stream_mixin.dart'; -import 'package:meta/meta.dart'; -import 'package:rxdart_ext/rxdart_ext.dart' - show PublishSubject, Subject, ValueSubject; +import 'package:rxdart_ext/rxdart_ext.dart'; import 'distinct_value_stream.dart'; @@ -37,83 +36,6 @@ import 'distinct_value_stream.dart'; /// subject.add(2); /// subject.add(3); /// subject.close(); -@sealed -class DistinctValueSubject extends Subject - with DistinctValueStreamMixin - implements DistinctValueStream { - final ValueSubject _subject; - - @override - final bool Function(T p1, T p2) equals; - - DistinctValueSubject._( - this.equals, - this._subject, - ) : super(_subject, _subject.stream); - - /// Constructs a [DistinctValueSubject], optionally pass handlers for - /// [onListen], [onCancel] and a flag to handle events [sync]. - /// - /// [seedValue] becomes the current [value] of Subject. - /// [equals] is used to determine equality between previous data event and current data event. - /// - /// See also [StreamController.broadcast], [ValueSubject]. - factory DistinctValueSubject( - T seedValue, { - bool Function(T p1, T p2)? equals, - void Function()? onListen, - FutureOr Function()? onCancel, - bool sync = false, - }) { - final subject = ValueSubject( - seedValue, - onListen: onListen, - onCancel: onCancel, - sync: sync, - ); - return DistinctValueSubject._( - equals ?? DistinctValueStream.defaultEquals, subject); - } - - @nonVirtual - @override - void add(T event) { - if (!equals(value, event)) { - _subject.add(event); - } - } - - @override - Future close() => _subject.close(); - - @override - Never addError(Object error, [StackTrace? stackTrace]) => - throw StateError('Cannot add error to DistinctValueSubject'); - - @override - Future addStream(Stream source, {bool? cancelOnError}) { - final completer = Completer.sync(); - source.listen( - add, - onError: addError, - onDone: completer.complete, - cancelOnError: cancelOnError, - ); - return completer.future; - } - - @override - Subject createForwardingSubject({ - void Function()? onListen, - void Function()? onCancel, - bool sync = false, - }) => - PublishSubject( - onListen: onListen, - onCancel: onCancel, - sync: sync, - ); - - @override - T get value => _subject.value; -} +@Deprecated( + "Use StateSubject from 'rxdart_ext' package instead. This package is deprecated!") +typedef DistinctValueSubject = StateSubject; diff --git a/pubspec.yaml b/pubspec.yaml index 512a9c9..e6fb735 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,18 +1,17 @@ name: distinct_value_connectable_stream description: Distinct value connectable stream for RxDart, useful for BLoC pattern -author: Petrus Nguyen Thai Hoc -version: 1.3.0 +version: 2.0.0 homepage: https://github.com/hoc081098/distinct_value_connectable_stream.git repository: https://github.com/hoc081098/distinct_value_connectable_stream.git issue_tracker: https://github.com/hoc081098/distinct_value_connectable_stream/issues environment: - sdk: '>=2.12.0 <3.0.0' + sdk: '>=2.14.0 <3.0.0' dependencies: - rxdart_ext: ^0.1.0 - meta: ^1.3.0 + rxdart_ext: ^0.1.2 + meta: ^1.7.0 dev_dependencies: pedantic: ^1.11.0 - test: ^1.17.3 + test: ^1.17.12 diff --git a/test/distinct_value_connectable_stream_test.dart b/test/distinct_value_connectable_stream_test.dart index 6755a35..f423549 100644 --- a/test/distinct_value_connectable_stream_test.dart +++ b/test/distinct_value_connectable_stream_test.dart @@ -1,3 +1,5 @@ +// ignore_for_file: deprecated_member_use_from_same_package + import 'dart:async'; import 'package:distinct_value_connectable_stream/distinct_value_connectable_stream.dart'; diff --git a/test/distinct_value_subject_test.dart b/test/distinct_value_subject_test.dart index b03eff5..b187616 100644 --- a/test/distinct_value_subject_test.dart +++ b/test/distinct_value_subject_test.dart @@ -1,3 +1,5 @@ +// ignore_for_file: deprecated_member_use_from_same_package + import 'dart:async'; import 'package:distinct_value_connectable_stream/distinct_value_connectable_stream.dart'; diff --git a/test/distinct_value_test.dart b/test/distinct_value_test.dart index 1ad9199..959b64f 100644 --- a/test/distinct_value_test.dart +++ b/test/distinct_value_test.dart @@ -1,3 +1,5 @@ +// ignore_for_file: deprecated_member_use_from_same_package + import 'dart:async'; import 'package:distinct_value_connectable_stream/distinct_value_connectable_stream.dart'; diff --git a/test/single_subscription_to_broadcast_test.dart b/test/single_subscription_to_broadcast_test.dart index 6b8cecf..d820acd 100644 --- a/test/single_subscription_to_broadcast_test.dart +++ b/test/single_subscription_to_broadcast_test.dart @@ -1,3 +1,5 @@ +// ignore_for_file: deprecated_member_use_from_same_package + import 'package:distinct_value_connectable_stream/distinct_value_connectable_stream.dart'; import 'package:test/test.dart';