typecraft
Version:
library for crafting types and casting type inhabitants
3 lines (2 loc) • 5.88 kB
JavaScript
function e(e,t,s,a){Object.defineProperty(e,t,{get:s,set:a,enumerable:!0,configurable:!0})}var t={};e(t,"unknown",(()=>s)),e(t,"never",(()=>a)),e(t,"primitive",(()=>u)),e(t,"string",(()=>r)),e(t,"number",(()=>n)),e(t,"bigint",(()=>c)),e(t,"boolean",(()=>l)),e(t,"symbol",(()=>i)),e(t,"array",(()=>o)),e(t,"tuple",(()=>p)),e(t,"record",(()=>v)),e(t,"object",(()=>f)),e(t,"enumeration",(()=>m)),e(t,"union",(()=>y)),e(t,"nullable",(()=>b)),e(t,"optional",(()=>d)),e(t,"intersection",(()=>g)),e(t,"pure",(()=>x)),e(t,"map",(()=>h)),e(t,"fix",(()=>w));const s={tag:"unknown"},a={tag:"never"},u=e=>({tag:"primitive",type:e}),r=u("string"),n=u("number"),c=u("bigint"),l=u("boolean"),i=u("symbol"),o=e=>({tag:"array",type:e}),p=(...e)=>({tag:"tuple",types:e}),v=e=>({tag:"record",type:e}),f=e=>({tag:"object",propTypes:e}),m=(...e)=>({tag:"enumeration",values:new Set(e)}),y=(...e)=>({tag:"union",types:e}),b=e=>y(e,u("null")),d=e=>y(e,u("undefined")),g=(...e)=>({tag:"intersection",types:e}),x=e=>({tag:"pure",value:e}),h=(e,t)=>({tag:"map",morphism:e,type:t}),w=e=>{const t=e({tag:"lazy",getType:()=>t});return t};e({},"cast",(()=>O));const j=e=>{if(0===e.length)return[[]];const[t,...s]=e,a=j(s);return t.flatMap((e=>a.map((t=>[e,...t]))))},k=e=>{if(0===e.length)return[{}];const[[t,s],...a]=e,u=k(a);return s.flatMap((e=>u.map((s=>({[t]:e,...s})))))},O=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=O(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]=j(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=>O(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]=j(t.map((e=>[e.value,...e.values])));return{status:"success",value:u,values:r}}}case"record":{const t=O(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]=k(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,O(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]=k(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=>O(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=>O(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]=j(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=O(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=>O(t)(e)}default:throw new TypeError(`unknown type ${e}`)}};var T={};e(T,"tap",(()=>A)),e(T,"pipe",(()=>E)),e(T,"backwards",(()=>M)),e(T,"feed",(()=>z)),e(T,"apply",(()=>$)),e(T,"nil",(()=>A)),e(T,"cons",(()=>E)),e(T,"reverse",(()=>M));const A=()=>null,E=(e,t)=>({head:e,tail:t}),M=e=>{let t=A();for(let s=e;null!==s;s=s.tail)t=E(s.head,t);return t},z=e=>t=>{let s=t;for(let t=e;null!==t;t=t.tail)s=t.head(s);return s},$=e=>z(M(e));export{s as unknown,a as never,u as primitive,r as string,n as number,c as bigint,l as boolean,i as symbol,o as array,p as tuple,v as record,f as object,m as enumeration,y as union,b as nullable,d as optional,g as intersection,x as pure,h as map,w as fix,O as cast,A as tap,A as nil,E as pipe,E as cons,M as backwards,M as reverse,z as feed,$ as apply};
//# sourceMappingURL=module.js.map