sequenceEqual

function stable

Compares all values of two observables in sequence using an optional comparator function and returns an observable of a single boolean value representing whether or not the two sequences are equal.

sequenceEqual<T>(compareTo: Observable<T>, comparator: (a: T, b: T) => boolean = (a, b) => a === b): OperatorFunction<T, boolean>

Parameters

compareTo

The observable sequence to compare the source sequence to.

comparator

Optional. Default is (a, b) => a === b.

An optional function to compare each value pair

Returns

OperatorFunction<T, boolean>: A function that returns an Observable that emits a single boolean value representing whether or not the values emitted by the source Observable and provided Observable were equal in sequence.

Description

Checks to see of all values emitted by both observables are equal, in order.

sequenceEqual marble diagram

sequenceEqual subscribes to two observables and buffers incoming values from each observable. Whenever either observable emits a value, the value is buffered and the buffers are shifted and compared from the bottom up; If any value pair doesn't match, the returned observable will emit false and complete. If one of the observables completes, the operator will wait for the other observable to complete; If the other observable emits before completing, the returned observable will emit false and complete. If one observable never completes or emits after the other completes, the returned observable will never complete.

Example

figure out if the Konami code matches

import { from, fromEvent } from 'rxjs';
import { sequenceEqual, bufferCount, mergeMap, map } from 'rxjs/operators';

const codes = from([
  'ArrowUp',
  'ArrowUp',
  'ArrowDown',
  'ArrowDown',
  'ArrowLeft',
  'ArrowRight',
  'ArrowLeft',
  'ArrowRight',
  'KeyB',
  'KeyA',
  'Enter', // no start key, clearly.
]);

const keys = fromEvent(document, 'keyup').pipe(map(e => e.code));
const matches = keys.pipe(
  bufferCount(11, 1),
  mergeMap(
    last11 => from(last11).pipe(sequenceEqual(codes)),
  ),
);
matches.subscribe(matched => console.log('Successful cheat at Contra? ', matched));

See Also

© 2015–2021 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors.
Code licensed under an Apache-2.0 License. Documentation licensed under CC BY 4.0.
https://rxjs.dev/api/operators/sequenceEqual