Home Reference Source Repository

src/Transients.js

import {
	assert,
	doneIterator,
	iteratorFor,
	iterateOver,
} from "akutils";

import ObjectProperty from "./ObjectProperty";
import Shadow from "./Shadow";
import StateType from "./StateType";
import TransientProperty from "./TransientProperty";

import appDebug, { TransientKey as DebugKey } from "./debug";
const debug = appDebug(DebugKey);


/*

*/
export class TransientsShadow extends Shadow {
	get size() {
		return this.__().size();
	}

	clear() {
		this.__().clear();
	}

	delete(id) {
		this.$$()._keyed.removeProperty(id);
	}

	entries() {
		return iterateOver(this.__().keys(), key => [ key, this[key] ] );
	}

	has(id) {
		return this.__().has(id);
	}

	keys() {
		return iteratorFor(this.__().keys());
	}

	set(id, property) {
		assert( a => a.is(id, "id must be specifeid for setting a transient property") );

		var trans = new TransientProperty(id, property);

		this.$$()._keyed.addProperty(id, trans);

		return trans;
	}

	sweep() {
		const property = this.$$();
		const keys = property._keyed.keysArray();

		for (let i=0, t; t=this[keys[i]]; i++) {
			if (!t.isLocked()) {
				this.delete(keys[i]);
			}
		}
	}

	values() {
		return iterateOver(this.__().keys(), key => this[key]);
	}

	[Symbol.iterator]() { return this.entries() }
}


export default class TransientsProperty extends ObjectProperty {
	constructor(id, property) {
		super();

		this.setShadowClass(TransientsShadow);
	}
}


StateType.defineType(TransientsProperty, spec => {
	spec.initialState({})
		.autoshadowOff
		.readonly
		.typeName("TransientsProperty");
});