111 lines
3.5 KiB
JavaScript
111 lines
3.5 KiB
JavaScript
"use strict";
|
|
var Class = require("../utils/class");
|
|
|
|
var AbstractPair = Class.inherit({
|
|
"className": "AbstractPair",
|
|
"constructor": function(first, second) {
|
|
Class.fn.constructor.call(this);
|
|
|
|
if (!this.constructor.firstType || !this.constructor.secondType) {
|
|
throw new Error("An attempt to instantiate a pair without declared member types");
|
|
}
|
|
if (!(first instanceof this.constructor.firstType)) {
|
|
throw new Error("An attempt to construct a pair from wrong arguments");
|
|
}
|
|
|
|
this.first = first;
|
|
this.second = second;
|
|
},
|
|
"destructor": function() {
|
|
this.first.destructor();
|
|
if (this.second) {
|
|
this.second.destructor();
|
|
}
|
|
|
|
Class.fn.destructor.call(this);
|
|
},
|
|
"<": function(other) {
|
|
if (!(other instanceof this.constructor)) {
|
|
throw new Error("Can't compare pairs with different content types");
|
|
}
|
|
if (this.constructor.complete) {
|
|
if (this.first["<"](other.first)) {
|
|
return true;
|
|
} else if(this.first["=="](other.first)) {
|
|
this.second["<"](other.second);
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return this.first["<"](other.first);
|
|
}
|
|
},
|
|
">": function(other) {
|
|
if (!(other instanceof this.constructor)) {
|
|
throw new Error("Can't compare pairs with different content types");
|
|
}
|
|
if (this.constructor.complete) {
|
|
if (this.first[">"](other.first)) {
|
|
return true;
|
|
} else if(this.first["=="](other.first)) {
|
|
this.second[">"](other.second);
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return this.first[">"](other.first);
|
|
}
|
|
},
|
|
"==": function(other) {
|
|
if (!(other instanceof this.constructor)) {
|
|
throw new Error("Can't compare pairs with different content types");
|
|
}
|
|
if (this.constructor.complete) {
|
|
return this.first["=="](other.first) && this.second["=="](other.second);
|
|
} else {
|
|
return this.first["=="](other.first);
|
|
}
|
|
}
|
|
});
|
|
|
|
AbstractPair.firstType = undefined;
|
|
AbstractPair.secondType = undefined;
|
|
AbstractPair.complete = false;
|
|
|
|
AbstractPair.template = function(first, second, complete) {
|
|
if (!(first instanceof Function) || !(second instanceof Function)) {
|
|
throw new Error("An attempt to create template pair from wrong arguments");
|
|
}
|
|
if (
|
|
!(first.prototype["<"] instanceof Function) ||
|
|
!(first.prototype[">"] instanceof Function) ||
|
|
!(first.prototype["=="] instanceof Function)
|
|
)
|
|
{
|
|
throw new Error("Not acceptable first type");
|
|
}
|
|
if (
|
|
complete &&
|
|
(
|
|
!(second.prototype["<"] instanceof Function) ||
|
|
!(second.prototype[">"] instanceof Function) ||
|
|
!(second.prototype["=="] instanceof Function)
|
|
)
|
|
)
|
|
{
|
|
throw new Error("Not acceptable second type");
|
|
}
|
|
var Pair = AbstractPair.inherit({
|
|
"className": "Pair",
|
|
"constructor": function(first, second) {
|
|
AbstractPair.fn.constructor.call(this, first, second);
|
|
}
|
|
});
|
|
Pair.firstType = first;
|
|
Pair.secondType = second;
|
|
Pair.complete = complete === true;
|
|
|
|
return Pair;
|
|
};
|
|
|
|
module.exports = AbstractPair; |