UNPKG

typecraft

Version:

library for crafting types and casting type inhabitants

3 lines (2 loc) 5.78 kB
function e(e,t){return Object.keys(t).forEach((function(s){"default"===s||"__esModule"===s||e.hasOwnProperty(s)||Object.defineProperty(e,s,{enumerable:!0,get:function(){return t[s]}})})),e}function t(e,t,s,a){Object.defineProperty(e,t,{get:s,set:a,enumerable:!0,configurable:!0})}var s={};t(s,"unknown",(()=>a)),t(s,"never",(()=>u)),t(s,"primitive",(()=>r)),t(s,"string",(()=>n)),t(s,"number",(()=>c)),t(s,"bigint",(()=>l)),t(s,"boolean",(()=>o)),t(s,"symbol",(()=>i)),t(s,"array",(()=>p)),t(s,"tuple",(()=>v)),t(s,"record",(()=>f)),t(s,"object",(()=>m)),t(s,"enumeration",(()=>y)),t(s,"union",(()=>d)),t(s,"nullable",(()=>b)),t(s,"optional",(()=>g)),t(s,"intersection",(()=>x)),t(s,"pure",(()=>h)),t(s,"map",(()=>j)),t(s,"fix",(()=>w));const a={tag:"unknown"},u={tag:"never"},r=e=>({tag:"primitive",type:e}),n=r("string"),c=r("number"),l=r("bigint"),o=r("boolean"),i=r("symbol"),p=e=>({tag:"array",type:e}),v=(...e)=>({tag:"tuple",types:e}),f=e=>({tag:"record",type:e}),m=e=>({tag:"object",propTypes:e}),y=(...e)=>({tag:"enumeration",values:new Set(e)}),d=(...e)=>({tag:"union",types:e}),b=e=>d(e,r("null")),g=e=>d(e,r("undefined")),x=(...e)=>({tag:"intersection",types:e}),h=e=>({tag:"pure",value:e}),j=(e,t)=>({tag:"map",morphism:e,type:t}),w=e=>{const t=e({tag:"lazy",getType:()=>t});return t};var O={};t(O,"cast",(()=>E));const k=e=>{if(0===e.length)return[[]];const[t,...s]=e,a=k(s);return t.flatMap((e=>a.map((t=>[e,...t]))))},T=e=>{if(0===e.length)return[{}];const[[t,s],...a]=e,u=T(a);return s.flatMap((e=>u.map((s=>({[t]:e,...s})))))},E=e=>{switch(e.tag){case"unknown":return e=>({status:"success",value:e,values:[]});case"never":return e=>({status:"failure",expected:"never",actual:e});case"primitive":{const{type:t}=e;switch(t){case"string":return e=>"string"==typeof e?{status:"success",value:e,values:[]}:{status:"failure",expected:"string",actual:e};case"number":return e=>"number"==typeof e?{status:"success",value:e,values:[]}:{status:"failure",expected:"number",actual:e};case"bigint":return e=>"bigint"==typeof e?{status:"success",value:e,values:[]}:{status:"failure",expected:"bigint",actual:e};case"boolean":return e=>"boolean"==typeof e?{status:"success",value:e,values:[]}:{status:"failure",expected:"boolean",actual:e};case"symbol":return e=>"symbol"==typeof e?{status:"success",value:e,values:[]}:{status:"failure",expected:"symbol",actual:e};case"null":return e=>null===e?{status:"success",value:e,values:[]}:{status:"failure",expected:"null",actual:e};case"undefined":return e=>void 0===e?{status:"success",value:e,values:[]}:{status:"failure",expected:"undefined",actual:e};default:throw new TypeError(`invalid primitive ${t}`)}}case"array":{const t=E(e.type);return e=>{if(!Array.isArray(e))return{status:"failure",expected:"array",actual:e};const s=e.map((e=>t(e)));if(s.some((e=>"success"!==e.status)))return{status:"failure",expected:"array",items:s,actual:e};const[a,...u]=k(s.map((e=>[e.value,...e.values])));return{status:"success",value:a,values:u}}}case"tuple":{const{types:t}=e,{length:s}=t,a=t.map((e=>E(e)));return e=>{if(!Array.isArray(e)||e.length!==s)return{status:"failure",expected:"tuple",length:s,actual:e};const t=a.map(((t,s)=>t(e[s])));if(t.some((e=>"success"!==e.status)))return{status:"failure",expected:"tuple",length:s,items:t,actual:e};const[u,...r]=k(t.map((e=>[e.value,...e.values])));return{status:"success",value:u,values:r}}}case"record":{const t=E(e.type);return e=>{if("object"!=typeof e||null===e)return{status:"failure",expected:"record",actual:e};const s=Object.entries(e).map((([e,s])=>[e,t(s)]));if(s.some((([e,t])=>"success"!==t.status)))return{status:"failure",expected:"record",properties:Object.fromEntries(s),actual:e};const[a,...u]=T(s.map((([e,t])=>[e,[t.value,...t.values]])));return{status:"success",value:a,values:u}}}case"object":{const t=Object.entries(e.propTypes).map((([e,t])=>[e,E(t)]));return e=>{if("object"!=typeof e||null===e)return{status:"failure",expected:"object",actual:e};const s=t.map((([t,s])=>[t,s(Object.hasOwn(e,t)?e[t]:void 0)]));if(s.some((([e,t])=>"success"!==t.status)))return{status:"failure",expected:"object",properties:Object.fromEntries(s),actual:e};const[a,...u]=T(s.map((([e,t])=>[e,[t.value,...t.values]])));return{status:"success",value:a,values:u}}}case"enumeration":{const{values:t}=e;return e=>t.has(e)?{status:"success",value:e,values:[]}:{status:"failure",expected:"enumeration",values:t,actual:e}}case"union":{const t=e.types.map((e=>E(e)));return e=>{const s=t.map((t=>t(e))),a=s.filter((e=>"success"===e.status));if(0===a.length)return{status:"failure",expected:"union",variants:s};const[u,...r]=a.flatMap((e=>[e.value,...e.values]));return{status:"success",value:u,values:r}}}case"intersection":{const t=e.types.map((e=>E(e)));return e=>{const s=t.map((t=>t(e)));if(s.some((e=>"success"!==e.status)))return{status:"failure",expected:"intersection",results:s};const[a,...u]=k(s.map((e=>[e.value,...e.values])));return{status:"success",value:a,values:u}}}case"pure":{const{value:t}=e;return e=>({status:"success",value:t,values:[]})}case"map":{const{morphism:t,type:s}=e,a=E(s);return e=>{const s=a(e);return"success"===s.status?{status:"success",value:t(s.value),values:s.values.map((e=>t(e)))}:s}}case"lazy":{const t=e.getType();return e=>E(t)(e)}default:throw new TypeError(`unknown type ${e}`)}};var A={};t(A,"tap",(()=>M)),t(A,"pipe",(()=>P)),t(A,"backwards",(()=>z)),t(A,"feed",(()=>$)),t(A,"apply",(()=>_)),t(A,"nil",(()=>M)),t(A,"cons",(()=>P)),t(A,"reverse",(()=>z));const M=()=>null,P=(e,t)=>({head:e,tail:t}),z=e=>{let t=M();for(let s=e;null!==s;s=s.tail)t=P(s.head,t);return t},$=e=>t=>{let s=t;for(let t=e;null!==t;t=t.tail)s=t.head(s);return s},_=e=>$(z(e));e(module.exports,s),e(module.exports,O),e(module.exports,A); //# sourceMappingURL=main.js.map