tsioc
Version:
tsioc is AOP, Ioc container, via typescript decorator
161 lines (159 loc) • 4.65 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var types_1 = require("../types");
var NullComponent_1 = require("./NullComponent");
var index_1 = require("../utils/index");
/**
* compoiste.
*
* @export
* @class Composite
* @implements {IComponent}
*/
var Composite = /** @class */ (function () {
function Composite(name) {
this.name = name;
this.children = [];
}
Composite.prototype.add = function (node) {
node.parent = this;
this.children.push(node);
return this;
};
Composite.prototype.remove = function (node) {
var component;
if (index_1.isString(node)) {
component = this.find(function (cmp) { return index_1.isString(node) ? cmp.name === node : cmp.equals(node); });
}
else if (node) {
component = node;
}
else {
component = this;
}
if (!component.parent) {
return this;
}
else if (this.equals(component.parent)) {
this.children.splice(this.children.indexOf(component), 1);
component.parent = null;
return this;
}
else {
component.parent.remove(component);
return this;
}
};
Composite.prototype.find = function (express, mode) {
var component;
this.each(function (item) {
if (component) {
return false;
}
var isFinded = index_1.isFunction(express) ? express(item) : express === item;
if (isFinded) {
component = item;
return false;
}
return true;
}, mode);
return (component || this.empty());
};
Composite.prototype.filter = function (express, mode) {
var nodes = [];
this.each(function (item) {
if (express(item)) {
nodes.push(item);
}
}, mode);
return nodes;
};
Composite.prototype.each = function (express, mode) {
mode = mode || types_1.Mode.traverse;
var r;
switch (mode) {
case types_1.Mode.route:
r = this.routeUp(express);
break;
case types_1.Mode.children:
r = this.eachChildren(express);
break;
case types_1.Mode.traverse:
r = this.trans(express);
break;
case types_1.Mode.traverseLast:
r = this.transAfter(express);
break;
default:
r = this.trans(express);
break;
}
return r;
};
Composite.prototype.eachChildren = function (express) {
(this.children || []).forEach(function (item) {
return express(item);
});
};
/**
*do express work in routing.
*
*@param {Express<T, void | boolean>} express
*
*@memberOf IComponent
*/
Composite.prototype.routeUp = function (express) {
if (express(this) === false) {
return false;
}
;
if (this.parent && this.parent.routeUp) {
return this.parent.routeUp(express);
}
};
/**
*translate all sub context to do express work.
*
*@param {Express<IComponent, void | boolean>} express
*
*@memberOf IComponent
*/
Composite.prototype.trans = function (express) {
if (express(this) === false) {
return false;
}
var children = this.children || [];
for (var i = 0; i < children.length; i++) {
var result = children[i].trans(express);
if (result === false) {
return result;
}
}
return true;
};
Composite.prototype.transAfter = function (express) {
var children = this.children || [];
for (var i = 0; i < children.length; i++) {
var result = children[i].transAfter(express);
if (result === false) {
return false;
}
}
if (express(this) === false) {
return false;
}
return true;
};
Composite.prototype.equals = function (node) {
return this === node;
};
Composite.prototype.empty = function () {
return NullComponent_1.NullNode;
};
Composite.prototype.isEmpty = function () {
return this.equals(this.empty());
};
return Composite;
}());
exports.Composite = Composite;
//# sourceMappingURL=../sourcemaps/components/Composite.js.map