match-iz
Version:
A tiny pattern-matching library in the style of the TC39 proposal
8 lines (7 loc) • 6.35 kB
JavaScript
/*
* match-iz
* v5.1.1
* https://github.com/shuckster/match-iz
* License: MIT
*/
var j=Object.defineProperty;var F=Object.getOwnPropertySymbols;var q=Object.prototype.hasOwnProperty,z=Object.prototype.propertyIsEnumerable;var L=(t,e,n)=>e in t?j(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,C=(t,e)=>{for(var n in e||(e={}))q.call(e,n)&&L(t,n,e[n]);if(F)for(var n of F(e))z.call(e,n)&&L(t,n,e[n]);return t};var H=(t,e)=>{var n={};for(var s in t)q.call(t,s)&&e.indexOf(s)<0&&(n[s]=t[s]);if(t!=null&&F)for(var s of F(t))e.indexOf(s)<0&&z.call(t,s)&&(n[s]=t[s]);return n};var Z=(t,e)=>{for(var n in e)j(t,n,{get:e[n],enumerable:!0})};var b={};Z(b,{instanceOf:()=>w,isArguments:()=>$,isArray:()=>x,isDate:()=>k,isFormData:()=>ct,isFunction:()=>B,isIterable:()=>it,isMap:()=>rt,isNumber:()=>et,isObject:()=>J,isPojo:()=>ot,isRegExp:()=>nt,isSet:()=>st,isString:()=>tt});var V=Object.prototype,_=V.toString,y=t=>e=>typeof e===t,w=t=>e=>e instanceof t;function m(t,e){let n={[e]:function(...s){return t.apply(this,s)}}[e];return Object.defineProperty(n,"name",{value:e}),n}var x=m(Array.isArray,"isArray"),$=m(t=>_.call(t)==="[object Arguments]","isArguments"),k=m(t=>w(Date)(t)&&!isNaN(t),"isDate"),B=m(y("function"),"isFunction"),tt=m(y("string"),"isString"),et=m(t=>t===t&&y("number")(t),"isNumber"),J=m(t=>t!==null&&y("object")(t),"isObject"),nt=m(w(RegExp),"isRegExp"),st=m(w(Set),"isSet"),rt=m(w(Map),"isMap"),ot=m(t=>t===null||!J(t)||$(t)?!1:Object.getPrototypeOf(t)===V,"isPojo"),it=m(t=>t!=null&&[t[Symbol.iterator],t.next].every(B),"isIterable"),ct=m(t=>typeof FormData!="undefined"&&w(FormData)(t),"isFormData");var{isArguments:ut,isArray:p,isDate:At,isFunction:d,isNumber:lt}=b,{isPojo:h,isRegExp:Q,isString:D,instanceOf:Kt}=b,{isMap:ft,isSet:mt,isIterable:gt,isFormData:pt}=b,{keys:a,entries:at,assign:N}=Object,O=2e4,dt=!0,Pt=()=>O,Rt=t=>{let e=O;return O=t,()=>O=e};function ht(t,e){for(let n=t.length-1;n>=0;n--)if(e(t[n]))return t[n]}function U(t,e){if(dt&&!M(e)){let n=`Exhausted all patterns without finding a match for input: ${JSON.stringify(t)}. Handle it, or use otherwise() for the fall-through case.`;throw new Error(n)}}function Wt(t){return(...e)=>wt(...e)(t)}var wt=(...t)=>e=>{let[n,s]=ut(e)?[{},Array.from(e)]:ft(e)||pt(e)?[{isMap:!0},e.entries()]:mt(e)?[{isSet:!0},e.values()]:[{},e];if(!gt(s)){let i=s,{found:g,result:f}=G(...t)(i);if(g)return f;let S=ht(t,M);return U(i,S),f}let o=s,[c,u]=t.reduce(([i,g],f)=>M(f)?[f,g]:[i,[...g,f]],[()=>({value:()=>{}}),[]]),r=[];do{let{value:i,done:g}=o.next();if(g)return U(o,c),c().value();r.push(i);let{found:f,result:S}=G(...u)(n.isSet?i:n.isMap?{key:i[0],value:i[1]}:[...r]);if(f)return S}while(r.length<O||n.isSet||n.isMap);throw new Error(`Hit iterationLimit: ${O}. Use setIterationLimit(Infinity) to disable.`)},G=(...t)=>{let e;return n=>({found:!!t.find(o=>{let c=o(n),{matched:u,value:r}=c||{};return[u,r].every(d)?u(n)&&(e=r(n),!0):c&&(e=c)}),result:e})},A="@@match-iz/rest",Ot=t=>d(t==null?void 0:t[A]),St=t=>t[A],T=Symbol("@@match-iz/otherwise"),M=t=>(t==null?void 0:t[T])===!0,Lt=t=>{let e=n=>({matched:()=>!0,value:()=>d(t)?t(n):t});return e[T]=!0,e},I=t=>e=>n=>{let s={haystack:n};return{matched:()=>l(t,n,o=>n=o,s),value:()=>d(e)?D(n)&&Q(t)?e(...bt(n.match(t))):e(n,s.rest):e}},jt=(...t)=>{if(t.length===1){let[e]=t;return I(e)}if(t.length===2){let[e,n]=t;return I(e)(n)}if(t.length>2){let e=t.slice(-1)[0],n=t.slice(0,-1);return I(Nt(n))(e)}throw new Error("Expected at least 1 argument")},bt=t=>{let{groups:e}=t;return e?[e,t]:[t]},l=(t,e,n,s={haystack:e})=>h(t)?a(t).every(o=>(s.consumedKeys=s.consumedKeys||[],s.consumedKeys.push(o),s.key=o,l(t[o],e==null?void 0:e[o],n,s))):p(t)?p(e)&&t.every((o,c)=>{let u=Ot(o)?St(o):o;return s.key=c,l(u,e==null?void 0:e[c],n,s)}):d(t)?t(e,n,s):D(e)&&Q(t)?t.test(e):t===e||[t,e].every(Number.isNaN),qt=(...t)=>(e,n,s)=>t.length===0||(d(t[0])?t[0](e):l(t[0],e,n,s))?(n(e),!0):!1,zt=(...t)=>{let e=t.length===0?()=>!0:t[0],n=()=>e,s=c=>(u,r)=>N(u,{[r]:c.haystack[r]}),o=(c,u)=>N(c,{[u]:e});return{[A]:(c,u,r)=>{if(h(r.haystack)){let i=[],g=a(r.haystack).reduce((W,E)=>((r.consumedKeys||[]).includes(E)?i.push(E):W.push(E),W),[]),f=i.reduce(s(r),{}),S=g.reduce(o,{}),R=l(N({},f,S),r.haystack,u);return R&&(r.rest=g.reduce(s(r),{})),R}if(p(r.haystack)){let i=r.haystack.slice(0,r.key),g=r.haystack.slice(r.key).map(n),f=l(i.concat(g),r.haystack,u);return f&&(r.rest=r.haystack.slice(r.key)),f}return!1}}},vt=(t,e)=>[t,e].every(p)?t.length===e.length:[t,e].every(h)?a(t).length===a(e).length:!0,Ft=t=>(e,n,s)=>vt(t,e)&&l(t,e,n,s),Ct=t=>K(t,e=>h(e)?Ft(e):e),Ht=t=>(e,n,s)=>!l(t,e,n,s),yt=(...t)=>(e,n,s)=>t.flat().some(o=>l(o,e,n,s)),Nt=(...t)=>(e,n,s)=>t.flat().every(o=>l(o,e,n,s)),Vt=t=>Y((e,n,s)=>e.every(o=>l(t,o,n,s))),$t=t=>Y((e,n,s)=>e.some(o=>l(t,o,n,s))),Bt=(...t)=>P((e,n,s)=>t.length<=e.length&&l(t,e.slice(0,t.length),n,s)),Jt=(...t)=>P((e,n,s)=>t.length<=e.length&&l(t,e.slice(e.length-t.length),n,s)),Dt=t=>t!==t||!t&&t!==0&&t!==!1||p(t)&&!t.length||h(t)&&!a(t).length,Ut=t=>!Dt(t),Gt=t=>v(e=>e>t),Qt=t=>v(e=>e<t),Tt=t=>v(e=>e>=t),Xt=t=>v(e=>e<=t),Yt=(t,e)=>v(n=>n>=Math.min(t,e)&&n<=Math.max(t,e)),Zt=t=>X(e=>e.startsWith(t)),_t=t=>X(e=>e.endsWith(t)),xt=t=>P(e=>e.includes(t)),kt=yt,te=t=>e=>e===t,ee=(...t)=>e=>h(e)&&(([n,s])=>n.length&&n.every(o=>s.includes(o)))([t.flat(),a(e)]),ne=n=>{var s=n,{getValue:t}=s,e=H(s,["getValue"]);return at(e).reduce((o,[c,u])=>N(o,{[c]:r=>i=>({matched:()=>u(i),value:()=>d(r)?r(t(i)):r})}),{})},se=t=>!!t,re=t=>!t,Et=t=>(e,n)=>(e[n]=K(e[n],t),e),It=t=>e=>K(e,t),K=(t,e)=>e(h(t)?a(t).reduce(Et(e),C({},t)):p(t)?t.map(It(e)):t),oe=t=>new Proxy({},{get:()=>t}),X=t=>e=>D(e)&&t(e),v=t=>e=>lt(e)&&t(e),Y=t=>(e,n,s)=>p(e)&&t(e,n,s),P=t=>(e,n,s)=>(p(e)||D(e))&&t(e,n,s);export{wt as against,Nt as allOf,yt as anyOf,ne as cata,Ct as deepEq,Ut as defined,Dt as empty,_t as endsWith,Ft as eq,Vt as every,re as falsy,Bt as firstOf,Pt as getIterationLimit,Gt as gt,Tt as gte,ee as hasOwn,Yt as inRange,kt as includedIn,xt as includes,Kt as instanceOf,p as isArray,At as isDate,d as isFunction,gt as isIterable,lt as isNumber,h as isPojo,Q as isRegExp,te as isStrictly,D as isString,Jt as lastOf,Qt as lt,Xt as lte,Wt as match,Ht as not,Lt as otherwise,qt as pluck,zt as rest,Rt as setIterationLimit,$t as some,oe as spread,Zt as startsWith,se as truthy,jt as when};