Skip to content

Commit 326afac

Browse files
committed
Add distinctBy
1 parent fd7585b commit 326afac

File tree

3 files changed

+46
-0
lines changed

3 files changed

+46
-0
lines changed

lib/src/transformers/distinct_by.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import 'dart:async';
2+
3+
/// Extends the Stream class with the ability to skip items that have previously
4+
/// been emitted.
5+
extension DistinctByExtension<T> on Stream<T> {
6+
/// Creates a Stream where data events are skipped if they have already
7+
/// been emitted before.
8+
///
9+
/// [Interactive marble diagram](http://rxmarbles.com/#distinct)
10+
Stream<T> distinctBy<S>(
11+
S Function(T it) distincter,
12+
) =>
13+
distinct((prev, next) => distincter(prev) == distincter(next));
14+
}

lib/transformers.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ library rx_transformers;
33
export 'src/transformers/default_if_empty.dart';
44
export 'src/transformers/delay.dart';
55
export 'src/transformers/dematerialize.dart';
6+
export 'src/transformers/distinct_by.dart';
67
export 'src/transformers/distinct_unique.dart';
78
export 'src/transformers/do.dart';
89
export 'src/transformers/exhaust_map.dart';
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import 'dart:async';
2+
3+
import 'package:rxdart/rxdart.dart';
4+
import 'package:test/test.dart';
5+
6+
void main() {
7+
test('Rx.distinctBy', () async {
8+
await expectLater(
9+
Stream.fromIterable(['123', 'abc']).distinctBy((value) => value.length),
10+
emitsInOrder(<dynamic>[
11+
'123',
12+
emitsDone
13+
]));
14+
await expectLater(
15+
Stream.fromIterable(['123', 'abc', '1234']).distinctBy((value) => value.length),
16+
emitsInOrder(<dynamic>[
17+
'123',
18+
'1234',
19+
emitsDone
20+
]));
21+
await expectLater(
22+
Stream.fromIterable(['1234', 'abc', '1234', 'abcd']).distinctBy((value) => value.length),
23+
emitsInOrder(<dynamic>[
24+
'1234',
25+
'abc',
26+
'1234',
27+
emitsDone
28+
]));
29+
});
30+
31+
}

0 commit comments

Comments
 (0)