ranges-set
Version:
Set operations on human-friendly ranges.
3 lines (2 loc) • 2.81 kB
JavaScript
var r=/^(?:0|[1-9]\d*)$/,n=/^(0|[1-9]\d*)\s*-\s*(0|[1-9]\d*)$/;function t(r,n){return r.t!==n.t?n.t-r.t:r.t?r.o>=n.o?r.o>n.o?1:0:-1:r.u-n.u||r.i-n.i}function o(r){return{t:1,o:r}}function e(r,n){return{t:0,u:r,i:n}}function u(r,n){var t,o,u,f,i,s,c=[];r:for(t=0;t<r.length;++t){if((o=r[t]).t){for(u=0;u<n.length;++u)if((f=n[u]).t&&f.o===o.o)continue r}else for(i=0;i<n.length;++i)if(!(s=n[i]).t){if(o.u>=s.u&&o.i<=s.i)continue r;if(o.u<=s.u&&o.i>=s.i){o.i>s.i&&r.splice(t+1,0,e(s.i+1,o.i)),o.u<s.u&&r.splice(t+1,0,e(o.u,s.u-1));continue r}o.u>=s.u&&o.u<=s.i?o.u=s.i+1:o.i>=s.u&&o.i<=s.i&&(o.i=s.u-1)}c.push(o)}return c}function f(r,n){if(r.length!==n.length)return!1;for(var o=0;o<r.length;++o)if(t(r[o],n[o]))return!1;return!0}function i(r){var n,t,o,e=[];for(n=0;n<r.length;++n)if((t=r[n]).t)e.push(t.o);else for(o=t.u;o<=t.i;++o)e.push(""+o);return e}function s(r,n){var t,o;return r.t!==n.t?null:r.t?r.o===n.o?r:null:(t=Math.max(r.u,n.u))>(o=Math.min(r.i,n.i))?null:e(t,o)}function c(r,n){var t,o,e,u,f=[];for(t=0;t<r.length;++t)for(o=r[t],e=0;e<n.length;++e)null!==(u=s(o,n[e]))&&f.push(u);return f}function x(r){var n,t,o=[],e=r.split(",");for(n=0;n<e.length;++n)(t=e[n].trim())&&M(o,p(t));return o}function p(t){var u,f,i,s;return r.test(t)?e(u=+t,u):(f=n.exec(t))?(i=+f[1],s=+f[2],e(Math.min(i,s),Math.max(i,s))):o(t)}function a(r){return r.map(l).join()}function l(r){return r.t?r.o:r.u===r.i?""+r.u:r.u+"-"+r.i}function v(r,n){var t,o,e,u,f,i;r:for(t=0;t<n.length;++t){if((o=n[t]).t){for(e=0;e<r.length;++e)if((u=r[e]).t&&u.o===o.o)continue r}else for(f=0;f<r.length;++f)if(!(i=r[f]).t&&i.u<=o.u&&i.i>=o.i)continue r;return!1}return!0}function h(r,n){var t;return r.t===n.t&&(r.t?r.o===n.o:((t=r.u<=n.i+1&&r.i>=n.u||n.u<=r.i+1&&n.i>=r.u)&&(r.u=Math.min(r.u,n.u),r.i=Math.max(r.i,n.i)),t))}function M(r,n){for(var o,e,u=0,f=r.length;u<f;){if(!(e=t(n,r[o=u+f>>>1])))return;e<0?f=o:u=o+1}_(r,n,u)||_(r,n,u+1)||r.splice(u,0,n)}function _(r,n,t){if(t&&t<=r.length&&h(r[t-1],n)){for(;t<r.length&&h(r[t-1],r[t]);)r.splice(t,1);return!0}return!1}exports._compare=t,exports._createLiteral=o,exports._createRange=e,exports._differenceReprs=u,exports._equalReprs=f,exports._expandReprs=i,exports._intersectionRepr=s,exports._intersectionReprs=c,exports._parse=x,exports._parseOne=p,exports._serialize=a,exports._serializeOne=l,exports._subsetReprs=v,exports._unionRepr=h,exports._unionReprs=M,exports._unionReprsAt=_,exports.difference=function(r,n){return a(u(x(r),x(n)))},exports.equal=function(r,n){return f(x(r),x(n))},exports.expand=function(r){return i(x(r))},exports.intersection=function(r,n){return a(c(x(r),x(n)))},exports.normalize=function(r){return a(x(r))},exports.subset=function(r,n){return v(x(r),x(n))},exports.union=function(r,n){return a(x(r+","+n))};
//# sourceMappingURL=index.js.map