@effect-ts/system
Version:
Effect-TS is a zero dependency set of libraries to write highly productive, purely functional TypeScript at scale.
477 lines (382 loc) • 9.36 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.HashSet = void 0;
exports.add = add;
exports.add_ = add_;
exports.beginMutation = beginMutation;
exports.chain = chain;
exports.chain_ = chain_;
exports.difference = difference;
exports.difference_ = difference_;
exports.endMutation = endMutation;
exports.equal = equal;
exports.every = every;
exports.every_ = every_;
exports.filter = filter;
exports.filter_ = filter_;
exports.forEach_ = forEach_;
exports.from = from;
exports.has_ = has_;
exports.intersection = intersection;
exports.intersection_ = intersection_;
exports.isSubset = isSubset;
exports.isSubset_ = isSubset_;
exports.make = make;
exports.map = map;
exports.map_ = map_;
exports.mutate_ = mutate_;
exports.partition = partition;
exports.partition_ = partition_;
exports.reduce = reduce;
exports.reduce_ = reduce_;
exports.remove = remove;
exports.remove_ = remove_;
exports.size = size;
exports.some = some;
exports.some_ = some_;
exports.toggle = toggle;
exports.toggle_ = toggle_;
exports.union = union;
exports.union_ = union_;
exports.values = values;
require("../../../Operator/index.js");
var _index2 = /*#__PURE__*/require("../../../Function/index.js");
var I = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../../../Iterable/index.js"));
var St = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../../../Structural/index.js"));
var HM = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../HashMap/core.js"));
var Tp = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../Tuple/index.js"));
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
// ets_tracing: off
class HashSet {
constructor(keyMap) {
this.keyMap = keyMap;
}
[Symbol.iterator]() {
return HM.keys(this.keyMap);
}
get [St.hashSym]() {
return St.hashIterator(this[Symbol.iterator]());
}
[St.equalsSym](that) {
return that instanceof HashSet && that.keyMap.size === this.keyMap.size && I.corresponds(this, that, St.equals);
}
}
exports.HashSet = HashSet;
function make() {
return new HashSet(HM.make());
}
/**
* Creates a new set from an Iterable
*/
function from(xs) {
return I.reduce_(xs, make(), (s, v) => add_(s, v));
}
function add_(set, v) {
return set.keyMap.editable ? (HM.set_(set.keyMap, v, true), set) : new HashSet(HM.set_(set.keyMap, v, true));
}
function add(v) {
return set => add_(set, v);
}
function remove_(set, v) {
return set.keyMap.editable ? (HM.remove_(set.keyMap, v), set) : new HashSet(HM.remove_(set.keyMap, v));
}
function remove(v) {
return set => remove_(set, v);
}
function values(set) {
return HM.keys(set.keyMap);
}
function has_(set, v) {
return HM.has_(set.keyMap, v);
}
/**
* Apply f to each element
*/
function forEach_(map, f) {
HM.forEachWithIndex_(map.keyMap, k => {
f(k);
});
}
/**
* Mutate `set` within the context of `f`.
*/
function mutate_(set, transient) {
const s = beginMutation(set);
transient(s);
return endMutation(s);
}
/**
* The set of elements which are in both the first and second set,
*
* the hash and equal of the 2 sets has to be the same
*/
function intersection_(l, r) {
const x = make();
return mutate_(x, y => {
for (const k of r) {
if (has_(l, k)) {
add_(y, k);
}
}
});
}
/**
* The set of elements which are in both the first and second set
*
* @ets_data_first intersection_
*/
function intersection(r) {
return l => intersection_(l, r);
}
/**
* Projects a Set through a function
*/
function map_(set, f) {
const r = make();
return mutate_(r, r => {
forEach_(set, e => {
const v = f(e);
if (!has_(r, v)) {
add_(r, v);
}
});
});
}
/**
* Projects a Set through a function
*
* @ets_data_first map_
*/
function map(f) {
return set => map_(set, f);
}
/**
* true if one or more elements match predicate
*
* @ets_data_first some_
*/
function some(predicate) {
return set => some_(set, predicate);
}
/**
* true if one or more elements match predicate
*/
function some_(set, predicate) {
let found = false;
for (const e of set) {
found = predicate(e);
if (found) {
break;
}
}
return found;
}
/**
* Calculate the number of keys pairs in a set
*/
function size(set) {
return HM.size(set.keyMap);
}
/**
* Creates an equal for a set
*/
function equal() {
return {
equals: (x, y) => {
if (y === x) {
return true;
}
if (size(x) !== size(y)) {
return false;
}
let eq = true;
for (const vx of x) {
if (!has_(y, vx)) {
eq = false;
break;
}
}
return eq;
}
};
}
/**
* true if all elements match predicate
*
* @ets_data_first every_
*/
function every(predicate) {
return set => every_(set, predicate);
}
/**
* true if all elements match predicate
*/
function every_(set, predicate) {
return (0, _index2.not)(some((0, _index2.not)(predicate)))(set);
}
/**
* Map + Flatten
*
* @ets_data_first chain_
*/
function chain(f) {
return set => chain_(set, f);
}
/**
* Map + Flatten
*/
function chain_(set, f) {
const r = make();
mutate_(r, r => {
forEach_(set, e => {
for (const a of f(e)) {
if (!has_(r, a)) {
add_(r, a);
}
}
});
});
return r;
}
/**
* `true` if and only if every element in the first set is an element of the second set,
*
* the hash and equal of the 2 sets has to be the same
*
* @ets_data_first isSubset_
*/
function isSubset(y) {
return x => isSubset_(y, x);
}
/**
* `true` if and only if every element in the first set is an element of the second set,
*
* the hash and equal of the 2 sets has to be the same
*/
function isSubset_(x, y) {
return every_(x, a => has_(y, a));
}
function filter(predicate) {
return set => filter_(set, predicate);
}
function filter_(set, predicate) {
const r = make();
return mutate_(r, r => {
const values_ = values(set);
let e;
while (!(e = values_.next()).done) {
const value = e.value;
if (predicate(value)) {
add_(r, value);
}
}
return r;
});
}
function partition(predicate) {
return set => partition_(set, predicate);
}
function partition_(set, predicate) {
const values_ = values(set);
let e;
const right = beginMutation(make());
const left = beginMutation(make());
while (!(e = values_.next()).done) {
const value = e.value;
if (predicate(value)) {
add_(right, value);
} else {
add_(left, value);
}
}
return Tp.tuple(endMutation(left), endMutation(right));
}
/**
* Mark `set` as mutable.
*/
function beginMutation(set) {
return new HashSet(HM.beginMutation(set.keyMap));
}
/**
* Mark `set` as immutable.
*/
function endMutation(set) {
set.keyMap.editable = false;
return set;
}
/**
* Form the set difference (`x` - `y`)
*/
function difference_(x, y) {
return mutate_(x, s => {
for (const k of y) {
remove_(s, k);
}
});
}
/**
* Form the set difference (`x` - `y`)
*
* @ets_data_first difference_
*/
function difference(y) {
return x => difference_(x, y);
}
/**
* Reduce a state over the map entries
*/
function reduce_(set, z, f) {
return HM.reduceWithIndex_(set.keyMap, z, (z, v) => f(z, v));
}
/**
* Reduce a state over the map entries
*
* @ets_data_first reduce_
*/
function reduce(z, f) {
return set => reduce_(set, z, f);
}
/**
* If element is present remove it, if not add it
*
* @ets_data_first toggle_
*/
function toggle(a) {
return set => toggle_(set, a);
}
/**
* If element is present remove it, if not add it
*/
function toggle_(set, a) {
return (has_(set, a) ? remove : add)(a)(set);
}
/**
* Form the union of two sets,
*
* the hash and equal of the 2 sets has to be the same
*/
function union_(l, r) {
const x = make();
return mutate_(x, x => {
forEach_(l, a => {
add_(x, a);
});
for (const a of r) {
add_(x, a);
}
});
}
/**
* Form the union of two sets,
*
* the hash and equal of the 2 sets has to be the same
*
* @ets_data_first union_
*/
function union(y) {
return x => union_(x, y);
}
//# sourceMappingURL=index.js.map