Skip to content

Instantly share code, notes, and snippets.

@sir-boformer
Last active June 29, 2018 13:14
Show Gist options
  • Save sir-boformer/d0518b7b4c832f2384bb3ab1f28bbe67 to your computer and use it in GitHub Desktop.
Save sir-boformer/d0518b7b4c832f2384bb3ab1f28bbe67 to your computer and use it in GitHub Desktop.
Poor Share Replay implementation
import 'dart:async';
import 'package:rxdart/rxdart.dart';
class ShareReplayTransformer<T> extends StreamTransformerBase<T, T> {
final StreamTransformer<T, T> transformer;
ShareReplayTransformer({int maxSize = 1, bool sync = false}) : transformer = _buildTransformer(maxSize, sync);
@override
Stream<T> bind(Stream<T> stream) {
return transformer.bind(stream);
}
static StreamTransformer<T, T> _buildTransformer<T>(int maxSize, bool sync) {
StreamSubscription<T> subscription;
ReplaySubject<T> subject;
return new StreamTransformer<T, T>((Stream<T> input, bool cancelOnError) {
if(subject == null) {
subject = ReplaySubject<T>(
maxSize: maxSize,
sync: sync,
onListen: () {
subscription = input.listen(
subject.add,
onError: subject.addError,
onDone: subject.close
);
},
onCancel: () {
subscription.cancel();
subscription = null;
},
);
}
return subject.stream.listen(null);
});
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment