Advertisement
Guest User

Untitled

a guest
May 26th, 2015
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.75 KB | None | 0 0
  1. // SO 29681639
  2.  
  3. import 'dart:convert';
  4. import 'dart:async' show Future, Stream;
  5. import 'dart:math' show Random;
  6.  
  7. final rnd = new Random();
  8. main() {
  9. lineStream()
  10. .transform(new Utf8Decoder())
  11. .transform(new Deduplicator())
  12. .take(20).listen((string) => print(string));
  13. }
  14.  
  15. Stream<List<int>> lineStream() async* {
  16. while(true) {
  17. yield intList().take(rnd.nextInt(100)).toList();
  18. }
  19. }
  20.  
  21. Iterable<int> intList() sync* {
  22. final string = '0112333456777888999abcccddddddeeeefff';
  23. for(var c in string.codeUnits) {
  24. yield c;
  25. }
  26. }
  27.  
  28. class Deduplicator extends Converter<String, List<String>> {
  29.  
  30. const Deduplicator();
  31.  
  32. List<String> convert(String data) {
  33. var lines = new List<String>();
  34.  
  35. _DeduplicatorSink._addSlice(data, 0, data.length, true, null, lines.add);
  36.  
  37. return lines;
  38. }
  39.  
  40. StringConversionSink startChunkedConversion(Sink<String> sink) {
  41. if (sink is! StringConversionSink) {
  42. sink = new StringConversionSink.from(sink);
  43. }
  44. return new _DeduplicatorSink(sink);
  45. }
  46. }
  47.  
  48. class _DeduplicatorSink extends StringConversionSinkBase {
  49. final StringConversionSink _sink;
  50. String _carry;
  51.  
  52. _DeduplicatorSink(this._sink);
  53.  
  54. void addSlice(String chunk, int start, int end, bool isLast) {
  55. _carry = _addSlice(chunk, start, end, isLast, _carry, _sink.add);
  56. if (isLast) _sink.close();
  57. }
  58.  
  59. void close() {
  60. addSlice('', 0, 0, true);
  61. }
  62.  
  63. static String _addSlice(String chunk, int start, int end, bool isLast, String carry,
  64. void adder(String val)) {
  65. var buf = new StringBuffer();
  66. int pos = start;
  67. while(pos < end) {
  68. String char = chunk[pos];
  69. if(char != carry) {
  70. carry = char;
  71. buf.write(char);
  72. }
  73. pos++;
  74. }
  75. adder(buf.toString());
  76. return carry;
  77. }
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement