blob: 4b16ab5fd7ab2d5757edc43370cc47cc79222ca2 [file] [log] [blame]
// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'from_handlers.dart';
/// A utility to chain extra behavior on a stream.
extension Tap<T> on Stream<T> {
/// Taps into this stream to allow additional handling on a single-subscriber
/// stream without first wrapping as a broadcast stream.
///
/// The [onValue] callback will be called with every value from this stream
/// before it is forwarded to listeners on the resulting stream.
/// May be null if only [onError] or [onDone] callbacks are needed.
///
/// The [onError] callback will be called with every error from this stream
/// before it is forwarded to listeners on the resulting stream.
///
/// The [onDone] callback will be called after this stream closes and before
/// the resulting stream is closed.
///
/// Errors from any of the callbacks are caught and ignored.
///
/// The callbacks may not be called until the tapped stream has a listener,
/// and may not be called after the listener has canceled the subscription.
Stream<T> tap(void Function(T)? onValue,
{void Function(Object, StackTrace)? onError,
void Function()? onDone}) =>
transformByHandlers(onData: (value, sink) {
try {
onValue?.call(value);
} catch (_) {/*Ignore*/}
sink.add(value);
}, onError: (error, stackTrace, sink) {
try {
onError?.call(error, stackTrace);
} catch (_) {/*Ignore*/}
sink.addError(error, stackTrace);
}, onDone: (sink) {
try {
onDone?.call();
} catch (_) {/*Ignore*/}
sink.close();
});
}