Skip to content

Instantly share code, notes, and snippets.

@zoechi
Last active August 29, 2015 14:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zoechi/de71c5802bc2e065cc41 to your computer and use it in GitHub Desktop.
Save zoechi/de71c5802bc2e065cc41 to your computer and use it in GitHub Desktop.
deduplicator transformer
// 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;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment