veffect
Version:
powerful TypeScript validation library built on the robust foundation of Effect combining exceptional type safety, high performance, and developer experience. Taking inspiration from Effect's functional principles, VEffect delivers a balanced approach tha
158 lines (157 loc) • 6.72 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.union = exports.start = exports.max = exports.make = exports.lessThan = exports.isNonEmpty = exports.intersect = exports.fromIterable = exports.end = exports.empty = exports.IntervalsTypeId = void 0;
var Chunk = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../../Chunk.js"));
var _Function = /*#__PURE__*/require("../../Function.js");
var Option = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../../Option.js"));
var Interval = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../../ScheduleInterval.js"));
var _errors = /*#__PURE__*/require("../errors.js");
function _getRequireWildcardCache(e) {
if ("function" != typeof WeakMap) return null;
var r = new WeakMap(),
t = new WeakMap();
return (_getRequireWildcardCache = function (e) {
return e ? t : r;
})(e);
}
function _interopRequireWildcard(e, r) {
if (!r && e && e.__esModule) return e;
if (null === e || "object" != typeof e && "function" != typeof e) return {
default: e
};
var t = _getRequireWildcardCache(r);
if (t && t.has(e)) return t.get(e);
var n = {
__proto__: null
},
a = Object.defineProperty && Object.getOwnPropertyDescriptor;
for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) {
var i = a ? Object.getOwnPropertyDescriptor(e, u) : null;
i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u];
}
return n.default = e, t && t.set(e, n), n;
}
/** @internal */
const IntervalsSymbolKey = "effect/ScheduleIntervals";
/** @internal */
const IntervalsTypeId = exports.IntervalsTypeId = /*#__PURE__*/Symbol.for(IntervalsSymbolKey);
/** @internal */
const make = intervals => {
return {
[IntervalsTypeId]: IntervalsTypeId,
intervals
};
};
/** @internal */
exports.make = make;
const empty = exports.empty = /*#__PURE__*/make( /*#__PURE__*/Chunk.empty());
/** @internal */
const fromIterable = intervals => Array.from(intervals).reduce((intervals, interval) => (0, _Function.pipe)(intervals, union(make(Chunk.of(interval)))), empty);
/** @internal */
exports.fromIterable = fromIterable;
const union = exports.union = /*#__PURE__*/(0, _Function.dual)(2, (self, that) => {
if (!Chunk.isNonEmpty(that.intervals)) {
return self;
}
if (!Chunk.isNonEmpty(self.intervals)) {
return that;
}
if (Chunk.headNonEmpty(self.intervals).startMillis < Chunk.headNonEmpty(that.intervals).startMillis) {
return unionLoop(Chunk.tailNonEmpty(self.intervals), that.intervals, Chunk.headNonEmpty(self.intervals), Chunk.empty());
}
return unionLoop(self.intervals, Chunk.tailNonEmpty(that.intervals), Chunk.headNonEmpty(that.intervals), Chunk.empty());
});
/** @internal */
const unionLoop = (_self, _that, _interval, _acc) => {
let self = _self;
let that = _that;
let interval = _interval;
let acc = _acc;
while (Chunk.isNonEmpty(self) || Chunk.isNonEmpty(that)) {
if (!Chunk.isNonEmpty(self) && Chunk.isNonEmpty(that)) {
if (interval.endMillis < Chunk.headNonEmpty(that).startMillis) {
acc = (0, _Function.pipe)(acc, Chunk.prepend(interval));
interval = Chunk.headNonEmpty(that);
that = Chunk.tailNonEmpty(that);
self = Chunk.empty();
} else {
interval = Interval.make(interval.startMillis, Chunk.headNonEmpty(that).endMillis);
that = Chunk.tailNonEmpty(that);
self = Chunk.empty();
}
} else if (Chunk.isNonEmpty(self) && Chunk.isEmpty(that)) {
if (interval.endMillis < Chunk.headNonEmpty(self).startMillis) {
acc = (0, _Function.pipe)(acc, Chunk.prepend(interval));
interval = Chunk.headNonEmpty(self);
that = Chunk.empty();
self = Chunk.tailNonEmpty(self);
} else {
interval = Interval.make(interval.startMillis, Chunk.headNonEmpty(self).endMillis);
that = Chunk.empty();
self = Chunk.tailNonEmpty(self);
}
} else if (Chunk.isNonEmpty(self) && Chunk.isNonEmpty(that)) {
if (Chunk.headNonEmpty(self).startMillis < Chunk.headNonEmpty(that).startMillis) {
if (interval.endMillis < Chunk.headNonEmpty(self).startMillis) {
acc = (0, _Function.pipe)(acc, Chunk.prepend(interval));
interval = Chunk.headNonEmpty(self);
self = Chunk.tailNonEmpty(self);
} else {
interval = Interval.make(interval.startMillis, Chunk.headNonEmpty(self).endMillis);
self = Chunk.tailNonEmpty(self);
}
} else if (interval.endMillis < Chunk.headNonEmpty(that).startMillis) {
acc = (0, _Function.pipe)(acc, Chunk.prepend(interval));
interval = Chunk.headNonEmpty(that);
that = Chunk.tailNonEmpty(that);
} else {
interval = Interval.make(interval.startMillis, Chunk.headNonEmpty(that).endMillis);
that = Chunk.tailNonEmpty(that);
}
} else {
throw new Error((0, _errors.getBugErrorMessage)("Intervals.unionLoop"));
}
}
return make((0, _Function.pipe)(acc, Chunk.prepend(interval), Chunk.reverse));
};
/** @internal */
const intersect = exports.intersect = /*#__PURE__*/(0, _Function.dual)(2, (self, that) => intersectLoop(self.intervals, that.intervals, Chunk.empty()));
/** @internal */
const intersectLoop = (_left, _right, _acc) => {
let left = _left;
let right = _right;
let acc = _acc;
while (Chunk.isNonEmpty(left) && Chunk.isNonEmpty(right)) {
const interval = (0, _Function.pipe)(Chunk.headNonEmpty(left), Interval.intersect(Chunk.headNonEmpty(right)));
const intervals = Interval.isEmpty(interval) ? acc : (0, _Function.pipe)(acc, Chunk.prepend(interval));
if ((0, _Function.pipe)(Chunk.headNonEmpty(left), Interval.lessThan(Chunk.headNonEmpty(right)))) {
left = Chunk.tailNonEmpty(left);
} else {
right = Chunk.tailNonEmpty(right);
}
acc = intervals;
}
return make(Chunk.reverse(acc));
};
/** @internal */
const start = self => {
return (0, _Function.pipe)(self.intervals, Chunk.head, Option.getOrElse(() => Interval.empty)).startMillis;
};
/** @internal */
exports.start = start;
const end = self => {
return (0, _Function.pipe)(self.intervals, Chunk.head, Option.getOrElse(() => Interval.empty)).endMillis;
};
/** @internal */
exports.end = end;
const lessThan = exports.lessThan = /*#__PURE__*/(0, _Function.dual)(2, (self, that) => start(self) < start(that));
/** @internal */
const isNonEmpty = self => {
return Chunk.isNonEmpty(self.intervals);
};
/** @internal */
exports.isNonEmpty = isNonEmpty;
const max = exports.max = /*#__PURE__*/(0, _Function.dual)(2, (self, that) => lessThan(self, that) ? that : self);
//# sourceMappingURL=intervals.js.map