Home Manual Reference Source

src/implementation/SingleElementDeque.js

import {IndexError} from '@failure-abstraction/error';
import Deque from './Deque.js';

/**
 * SingleElementDeque.
 *
 * @param {Iterable<any>} iterable
 */
export default function SingleElementDeque(iterable) {
	this._empty = true;

	this._value = 0;

	if (iterable !== null) {
		this.extend(iterable);
	}
}

SingleElementDeque.prototype = new Deque();

SingleElementDeque.prototype.len = function () {
	return this._empty ? 0 : 1;
};

SingleElementDeque.prototype.capacity = function () {
	return 1;
};

SingleElementDeque.prototype.values = function* () {
	if (this._empty) {
		return;
	}

	yield this._value;
};

SingleElementDeque.prototype.append =
	// eslint-disable-next-line no-multi-assign
	SingleElementDeque.prototype.appendleft = function (x) {
		this._empty = false;
		this._value = x;

		return this;
	};

SingleElementDeque.prototype.clear = function () {
	this._empty = true;
	this._value = 0;

	return this;
};

SingleElementDeque.prototype.copy = function () {
	return new SingleElementDeque(this);
};

SingleElementDeque.prototype.pop =
	// eslint-disable-next-line no-multi-assign
	SingleElementDeque.prototype.popleft = function () {
		if (this._empty) {
			throw new IndexError('pop / popleft');
		}

		const value = this._value;

		this._empty = true;
		this._value = 0;

		return value;
	};

SingleElementDeque.prototype.get = function (i) {
	if (this._empty || i !== 0) {
		throw new IndexError(i);
	}

	return this._value;
};

SingleElementDeque.prototype.set = function (i, value) {
	if (this._empty || i !== 0) {
		throw new IndexError(i);
	}

	this._value = value;

	return this;
};