88 lines
4.3 KiB
JavaScript
88 lines
4.3 KiB
JavaScript
import * as RA from "../../Array.js";
|
|
import * as Chunk from "../../Chunk.js";
|
|
import { dual, pipe } from "../../Function.js";
|
|
import * as HashSet from "../../HashSet.js";
|
|
import { hasProperty } from "../../Predicate.js";
|
|
import * as STM from "../../STM.js";
|
|
import * as core from "./core.js";
|
|
import * as tMap from "./tMap.js";
|
|
/** @internal */
|
|
const TSetSymbolKey = "effect/TSet";
|
|
/** @internal */
|
|
export const TSetTypeId = /*#__PURE__*/Symbol.for(TSetSymbolKey);
|
|
const tSetVariance = {
|
|
/* c8 ignore next */
|
|
_A: _ => _
|
|
};
|
|
/** @internal */
|
|
class TSetImpl {
|
|
tMap;
|
|
[TSetTypeId] = tSetVariance;
|
|
constructor(tMap) {
|
|
this.tMap = tMap;
|
|
}
|
|
}
|
|
const isTSet = u => hasProperty(u, TSetTypeId);
|
|
/** @internal */
|
|
export const add = /*#__PURE__*/dual(2, (self, value) => tMap.set(self.tMap, value, void 0));
|
|
/** @internal */
|
|
export const difference = /*#__PURE__*/dual(2, (self, other) => core.flatMap(toHashSet(other), values => removeIf(self, value => HashSet.has(values, value), {
|
|
discard: true
|
|
})));
|
|
/** @internal */
|
|
export const empty = () => fromIterable([]);
|
|
/** @internal */
|
|
export const forEach = /*#__PURE__*/dual(2, (self, f) => reduceSTM(self, void 0, (_, value) => f(value)));
|
|
/** @internal */
|
|
export const fromIterable = iterable => core.map(tMap.fromIterable(Array.from(iterable).map(a => [a, void 0])), tMap => new TSetImpl(tMap));
|
|
/** @internal */
|
|
export const has = /*#__PURE__*/dual(2, (self, value) => tMap.has(self.tMap, value));
|
|
/** @internal */
|
|
export const intersection = /*#__PURE__*/dual(2, (self, other) => core.flatMap(toHashSet(other), values => pipe(self, retainIf(value => pipe(values, HashSet.has(value)), {
|
|
discard: true
|
|
}))));
|
|
/** @internal */
|
|
export const isEmpty = self => tMap.isEmpty(self.tMap);
|
|
/** @internal */
|
|
export const make = (...elements) => fromIterable(elements);
|
|
/** @internal */
|
|
export const reduce = /*#__PURE__*/dual(3, (self, zero, f) => tMap.reduce(self.tMap, zero, (acc, _, key) => f(acc, key)));
|
|
/** @internal */
|
|
export const reduceSTM = /*#__PURE__*/dual(3, (self, zero, f) => tMap.reduceSTM(self.tMap, zero, (acc, _, key) => f(acc, key)));
|
|
/** @internal */
|
|
export const remove = /*#__PURE__*/dual(2, (self, value) => tMap.remove(self.tMap, value));
|
|
/** @internal */
|
|
export const removeAll = /*#__PURE__*/dual(2, (self, iterable) => tMap.removeAll(self.tMap, iterable));
|
|
/** @internal */
|
|
export const removeIf = /*#__PURE__*/dual(args => isTSet(args[0]), (self, predicate, options) => options?.discard === true ? tMap.removeIf(self.tMap, key => predicate(key), {
|
|
discard: true
|
|
}) : pipe(tMap.removeIf(self.tMap, key => predicate(key)), core.map(RA.map(entry => entry[0]))));
|
|
/** @internal */
|
|
export const retainIf = /*#__PURE__*/dual(args => isTSet(args[0]), (self, predicate, options) => options?.discard === true ? tMap.retainIf(self.tMap, key => predicate(key), {
|
|
discard: true
|
|
}) : pipe(tMap.retainIf(self.tMap, key => predicate(key)), core.map(RA.map(entry => entry[0]))));
|
|
/** @internal */
|
|
export const size = self => core.map(toChunk(self), chunk => chunk.length);
|
|
/** @internal */
|
|
export const takeFirst = /*#__PURE__*/dual(2, (self, pf) => tMap.takeFirst(self.tMap, key => pf(key)));
|
|
/** @internal */
|
|
export const takeFirstSTM = /*#__PURE__*/dual(2, (self, pf) => tMap.takeFirstSTM(self.tMap, key => pf(key)));
|
|
/** @internal */
|
|
export const takeSome = /*#__PURE__*/dual(2, (self, pf) => tMap.takeSome(self.tMap, key => pf(key)));
|
|
/** @internal */
|
|
export const takeSomeSTM = /*#__PURE__*/dual(2, (self, pf) => tMap.takeSomeSTM(self.tMap, key => pf(key)));
|
|
/** @internal */
|
|
export const toChunk = self => tMap.keys(self.tMap).pipe(STM.map(Chunk.unsafeFromArray));
|
|
/** @internal */
|
|
export const toHashSet = self => reduce(self, HashSet.empty(), (acc, value) => pipe(acc, HashSet.add(value)));
|
|
/** @internal */
|
|
export const toArray = self => reduce(self, [], (acc, value) => [...acc, value]);
|
|
/** @internal */
|
|
export const toReadonlySet = self => core.map(toArray(self), values => new Set(values));
|
|
/** @internal */
|
|
export const transform = /*#__PURE__*/dual(2, (self, f) => tMap.transform(self.tMap, (key, value) => [f(key), value]));
|
|
/** @internal */
|
|
export const transformSTM = /*#__PURE__*/dual(2, (self, f) => tMap.transformSTM(self.tMap, (key, value) => core.map(f(key), a => [a, value])));
|
|
/** @internal */
|
|
export const union = /*#__PURE__*/dual(2, (self, other) => forEach(other, value => add(self, value)));
|
|
//# sourceMappingURL=tSet.js.map
|