import { Observable as ObservableT, Subscription } from './index' import Observable from './observable' /** * Create an observable that skips values if they're the same as the previous one. * * {@link skipRepeats} takes source `Observable` and returns an output `Observable` which will ignore repeat * emissions from the source. Any values emitted multiple times from the source `Observable` will be discarded after * the first emission. * * @note In some libraries this is called `distinctUntilChanged`. * * @example Marble diagram * * // source s: |--1--1--2--3--4--4--4--4--5-| * // skipRepeats(s): |--1-----2--3--4-----------5-| * * @param {ObservableT} source source observable * @returns {ObservableT} the new observable that skips repeated values */ export default function skipRepeats(source: ObservableT): ObservableT { return new Observable( ({ complete, error, next }): Subscription => { let lastValue = {} return source.subscribe({ complete, error, next: (value): false | void => lastValue !== value && next((lastValue = value)) }) } ) }