Home Manual Reference Source

src/BasePairs.js

import {map} from '@iterable-iterator/map';
import {filter} from '@iterable-iterator/filter';
import {NotImplementedError} from '@failure-abstraction/error';
import iterableFromMap from './iterableFromMap.js';

export default class BasePairs {
	// Set-like
	add() {
		throw new NotImplementedError('BasePairs#add: Not implemented.');
	}

	clear() {
		throw new NotImplementedError('BasePairs#clear: Not implemented.');
	}

	delete() {
		throw new NotImplementedError('BasePairs#delete: Not implemented.');
	}

	has([A, B]) {
		return this._map.has(A) && this._map.get(A).has(B);
	}

	values() {
		return iterableFromMap(this._map);
	}

	*entries() {
		for (const value of this.values()) yield [value, value];
	}

	keys() {
		return this.values();
	}

	[Symbol.iterator]() {
		return this.values();
	}

	forEach(callbackFn, thisArg = this) {
		for (const value of this.values()) callbackFn.call(thisArg, value);
	}

	// Custom

	update(pairs) {
		for (const pair of pairs) this.add(pair);
		return this;
	}

	left() {
		return this._map.keys();
	}

	right() {
		return new Set(map((x) => x[1], this.values())).keys();
	}

	*rightOf(A) {
		if (this._map.has(A)) yield* this._map.get(A);
	}

	leftOf(B) {
		return map(
			(x) => x[0],
			filter((x) => B === x[1], this.values()),
		);
	}
}