API Reference

equality-service

API entries in this module: 2

Current equality-service implementation

IEqualityService resolves to EqualityService in RsXCoreModule singleton scope. Consumers should resolve the service via RsXCoreInjectionTokens.IEqualityService instead of instantiating the class directly.

The default implementation uses fast-equals with custom object handling. For most objects it performs deep equality. For RxJS Observables, it compares by reference (a === b) to avoid treating separate stream instances as equal by structure.

This service is used by runtime change-detection decisions where rs-x needs to know whether a value is materially changed before propagating updates.

Example: use IEqualityService

import {
  InjectionContainer,
  RsXCoreInjectionTokens,
  RsXCoreModule,
  type IEqualityService,
} from '@rs-x/core';

await InjectionContainer.load(RsXCoreModule);

const equality = InjectionContainer.get<IEqualityService>(
  RsXCoreInjectionTokens.IEqualityService,
);

const left = { id: 1, nested: { name: 'Ada' } };
const right = { id: 1, nested: { name: 'Ada' } };

console.log(equality.isEqual(left, right)); // true

How to extend or modify

Provide your own IEqualityService implementation and rebind RsXCoreInjectionTokens.IEqualityService to your custom class. Keep singleton scope so all runtime components share the same equality behavior.

Override equality service

import { createCustomEqual } from 'fast-equals';
import {
  ContainerModule,
  InjectionContainer,
  Injectable,
  RsXCoreInjectionTokens,
  type IEqualityService,
} from '@rs-x/core';

@Injectable()
class StrictReferenceEqualityService implements IEqualityService {
  public isEqual = createCustomEqual({
    createCustomConfig: (base) => ({
      ...base,
      areObjectsEqual: (a, b) => a === b,
    }),
  });
}

const module = new ContainerModule((options) => {
  if (options.isBound(RsXCoreInjectionTokens.IEqualityService)) {
    options.unbind(RsXCoreInjectionTokens.IEqualityService);