Home Manual Reference Source

src/3-tree/implementations/1-Single.js

import {Tree} from '../base/index.js';
import {cache, Split} from '../../0-core/index.js';
import {One} from '../../1-digit/index.js';
import {Empty, Deep} from './index.js';

export function Single(M, value) {
	this.M = M;
	this.a = value;
	this.v = M.measure(value);
}

Single.prototype = new Tree();

Single.prototype.measure = function () {
	return this.v;
};

Single.prototype.isEmpty = function () {
	return false;
};

Single.prototype.head = function () {
	return this.a;
};

Single.prototype.last = function () {
	return this.a;
};

Single.prototype.tail = function () {
	return new Empty(this.M);
};

Single.prototype.init = function () {
	return new Empty(this.M);
};

Single.prototype.cons = function (value) {
	return new Deep(
		this.M,
		new One(value),
		new Empty(cache(this.M)),
		new One(this.a),
	);
};

Single.prototype.push = function (value) {
	return new Deep(
		this.M,
		new One(this.a),
		new Empty(cache(this.M)),
		new One(value),
	);
};

Single.prototype.concat = function (other) {
	return other.cons(this.a);
};

Single.prototype[Symbol.iterator] =
	// eslint-disable-next-line no-multi-assign
	Single.prototype.reversed = function* () {
		yield this.a;
	};

/**
 * It is assumed that p(i+|this|) is true.
 */
Single.prototype.splitTree = function (_p, _i) {
	return new Split(new Empty(this.M), this.a, new Empty(this.M));
};

Single.prototype.split = function (p) {
	return p(this.measure())
		? [new Empty(this.M), this]
		: [this, new Empty(this.M)];
};