forked from enviPath/enviPy
154 lines
3.2 KiB
JavaScript
154 lines
3.2 KiB
JavaScript
/****************************************************************************
|
|
* Copyright 2017 EPAM Systems
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
***************************************************************************/
|
|
|
|
/* global module*/
|
|
|
|
var Set = {
|
|
empty: function () {
|
|
return {};
|
|
},
|
|
|
|
single: function (item) {
|
|
var set = {};
|
|
Set.add(set, item);
|
|
return set;
|
|
},
|
|
|
|
size: function (set) {
|
|
var cnt = 0;
|
|
for (var id in set) {
|
|
if (set[id] !== Object.prototype[id])
|
|
cnt++;
|
|
}
|
|
return cnt;
|
|
},
|
|
|
|
contains: function (set, v) {
|
|
return typeof (set[v]) !== 'undefined' && set[v] !== Object.prototype[v];
|
|
},
|
|
|
|
subset: function (subset, superset) {
|
|
for (var id in subset) {
|
|
if (subset[id] !== Object.prototype[id] && superset[id] !== subset[id])
|
|
return false;
|
|
}
|
|
return true;
|
|
},
|
|
|
|
intersection: function (set1, set2) {
|
|
var set = {};
|
|
for (var id in set1) {
|
|
if (set1[id] !== Object.prototype[id] && set2[id] === set1[id])
|
|
Set.add(set, id);
|
|
}
|
|
return set;
|
|
},
|
|
|
|
disjoint: function (set1, set2) {
|
|
for (var id in set1) {
|
|
if (set1[id] !== Object.prototype[id] && set2[id] === set1[id])
|
|
return false;
|
|
}
|
|
return true;
|
|
},
|
|
|
|
eq: function (set1, set2) {
|
|
return Set.subset(set1, set2) && Set.subset(set2, set1);
|
|
},
|
|
|
|
each: function (set, func, context) {
|
|
for (var v in set) {
|
|
if (set[v] !== Object.prototype[v])
|
|
func.call(context, set[v]);
|
|
}
|
|
},
|
|
|
|
filter: function (set, func, context) {
|
|
var subset = {};
|
|
for (var v in set) {
|
|
if (set[v] !== Object.prototype[v] && func.call(context, set[v]))
|
|
subset[set[v]] = set[v];
|
|
}
|
|
return subset;
|
|
},
|
|
|
|
pick: function (set) {
|
|
for (var v in set) {
|
|
if (set[v] !== Object.prototype[v])
|
|
return set[v];
|
|
}
|
|
return null;
|
|
},
|
|
|
|
list: function (set) {
|
|
var list = [];
|
|
for (var v in set) {
|
|
if (set[v] !== Object.prototype[v])
|
|
list.push(set[v]);
|
|
}
|
|
return list;
|
|
},
|
|
|
|
add: function (set, item) {
|
|
set[item] = item;
|
|
},
|
|
|
|
mergeIn: function (set, other) {
|
|
Set.each(other, function (item) {
|
|
Set.add(set, item);
|
|
});
|
|
},
|
|
|
|
remove: function (set, item) {
|
|
var v = set[item];
|
|
delete set[item];
|
|
return v;
|
|
},
|
|
|
|
clone: function (other) {
|
|
var set = {};
|
|
Set.mergeIn(set, other);
|
|
return set;
|
|
},
|
|
|
|
fromList: function (list) {
|
|
var set = {};
|
|
if (list) {
|
|
for (var i = 0; i < list.length; ++i)
|
|
set[list[i] - 0] = list[i] - 0;
|
|
}
|
|
return set;
|
|
},
|
|
|
|
keySetInt: function (map) {
|
|
var set = {};
|
|
map.each(function (id) {
|
|
set[id - 0] = id - 0;
|
|
});
|
|
return set;
|
|
},
|
|
|
|
find: function (set, func, context) {
|
|
for (var v in set) {
|
|
if (set[v] !== Object.prototype[v] && func.call(context, set[v]))
|
|
return v;
|
|
}
|
|
return null;
|
|
}
|
|
};
|
|
|
|
module.exports = Set;
|