tsioc
Version:
tsioc is AOP, Ioc container, via typescript decorator
157 lines (155 loc) • 4.66 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");
var GComposite = /** @class */ (function () {
function GComposite(name) {
this.name = name;
this.children = [];
}
GComposite.prototype.add = function (node) {
node.parent = this;
this.children.push(node);
return this;
};
GComposite.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 null;
}
};
GComposite.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());
};
GComposite.prototype.filter = function (express, mode) {
var nodes = [];
this.each(function (item) {
if (express(item)) {
nodes.push(item);
}
}, mode);
return nodes;
};
GComposite.prototype.each = function (iterate, mode) {
mode = mode || types_1.Mode.traverse;
var r;
switch (mode) {
case types_1.Mode.route:
r = this.routeUp(iterate);
break;
case types_1.Mode.children:
r = this.eachChildren(iterate);
break;
case types_1.Mode.traverse:
r = this.trans(iterate);
break;
case types_1.Mode.traverseLast:
r = this.transAfter(iterate);
break;
default:
r = this.trans(iterate);
break;
}
return r;
};
GComposite.prototype.eachChildren = function (iterate) {
(this.children || []).forEach(function (item) {
return iterate(item);
});
};
/**
*do express work in routing.
*
*@param {Express<T, void | boolean>} express
*
*@memberOf IComponent
*/
GComposite.prototype.routeUp = function (iterate) {
var curr = this;
if (iterate(curr) === false) {
return false;
}
;
if (this.parent && this.parent.routeUp) {
return this.parent.routeUp(iterate);
}
};
/**
*translate all sub context to do express work.
*
*@param {Express<T, void | boolean>} express
*
*@memberOf IComponent
*/
GComposite.prototype.trans = function (express) {
var curr = this;
if (express(curr) === 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;
};
GComposite.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;
}
}
var curr = this;
if (express(curr) === false) {
return false;
}
return true;
};
GComposite.prototype.equals = function (node) {
return this === node;
};
GComposite.prototype.empty = function () {
return NullComponent_1.NullNode;
};
GComposite.prototype.isEmpty = function () {
return this.equals(this.empty());
};
return GComposite;
}());
exports.GComposite = GComposite;
//# sourceMappingURL=../sourcemaps/components/GComposite.js.map