Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // SO 29681639
- import 'dart:convert';
- import 'dart:async' show Future, Stream;
- import 'dart:math' show Random;
- final rnd = new Random();
- main() {
- lineStream()
- .transform(new Utf8Decoder())
- .transform(new Deduplicator())
- .take(20).listen((string) => print(string));
- }
- Stream<List<int>> lineStream() async* {
- while(true) {
- yield intList().take(rnd.nextInt(100)).toList();
- }
- }
- Iterable<int> intList() sync* {
- final string = '0112333456777888999abcccddddddeeeefff';
- for(var c in string.codeUnits) {
- yield c;
- }
- }
- class Deduplicator extends Converter<String, List<String>> {
- const Deduplicator();
- List<String> convert(String data) {
- var lines = new List<String>();
- _DeduplicatorSink._addSlice(data, 0, data.length, true, null, lines.add);
- return lines;
- }
- StringConversionSink startChunkedConversion(Sink<String> sink) {
- if (sink is! StringConversionSink) {
- sink = new StringConversionSink.from(sink);
- }
- return new _DeduplicatorSink(sink);
- }
- }
- class _DeduplicatorSink extends StringConversionSinkBase {
- final StringConversionSink _sink;
- String _carry;
- _DeduplicatorSink(this._sink);
- void addSlice(String chunk, int start, int end, bool isLast) {
- _carry = _addSlice(chunk, start, end, isLast, _carry, _sink.add);
- if (isLast) _sink.close();
- }
- void close() {
- addSlice('', 0, 0, true);
- }
- static String _addSlice(String chunk, int start, int end, bool isLast, String carry,
- void adder(String val)) {
- var buf = new StringBuffer();
- int pos = start;
- while(pos < end) {
- String char = chunk[pos];
- if(char != carry) {
- carry = char;
- buf.write(char);
- }
- pos++;
- }
- adder(buf.toString());
- return carry;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement