UNPKG

variant-type

Version:

A Variant is a data structure that can be used to represent any other data type.

1 lines 6.11 kB
{"version":3,"file":"variant-type.modern.mjs","sources":["../src/variant-type.js"],"sourcesContent":["import { checkArgTypes as check, toType } from \"check-arg-types\";\n\nconst hasProp = Object.prototype.hasOwnProperty;\nconst DEFAULT_HANDLER = \"_\";\n\nfunction getTestFunc(f) {\n const str = f.toString();\n if (str.includes(\"native code\")) {\n return (v) => toType(v) === toType(f());\n } else {\n return f;\n }\n}\n\nexport default function VariantFactory(types) {\n const Variant = {};\n const typeNames = Object.keys(types).concat([DEFAULT_HANDLER]);\n\n if (typeNames.includes(\"case\")) {\n throw new Error(\"`case` is a reserved key!\");\n }\n\n const checkArgs = (args, caseKey) => {\n if (caseKey === DEFAULT_HANDLER) {\n return;\n }\n\n const len = types[caseKey].length;\n if (args.length !== len) {\n throw new Error(\n \"Arguments did not match for \" +\n caseKey +\n \": Expected \" +\n len +\n \", Received \" +\n args.length,\n );\n }\n\n const validators = types[caseKey];\n for (let x = 0; x < len; x++) {\n const validator = validators[x];\n const value = args[x];\n if (!getTestFunc(validator)(value)) {\n throw new TypeError(`\"${value}\" is not a valid ${validator.name}!`);\n }\n }\n };\n\n typeNames.forEach((type) => {\n Variant[type] = function TypeClosure(...args) {\n checkArgs(args, type);\n args.type = type;\n return args;\n };\n });\n\n function caseFunc(cases) {\n const Cases = {};\n const caseKeys = Object.keys(cases);\n\n caseKeys.forEach((caseKey) => {\n if (!typeNames.includes(caseKey)) {\n throw new Error(\n \"Invalid case key given for Variant: `\" +\n caseKey +\n \"` not in [\" +\n typeNames.join(\", \") +\n \"]\",\n );\n }\n\n Cases[caseKey] = function TypeCase() {\n const args = Array.prototype.slice.call(arguments);\n checkArgs(args, caseKey);\n return cases[caseKey].apply(null, args);\n };\n });\n\n return function handleCaseValue(getType) {\n const args = typeof getType === \"function\" ? getType() : getType;\n const handler = hasProp.call(Cases, args.type)\n ? Cases[args.type]\n : Cases[DEFAULT_HANDLER];\n if (!handler) {\n throw new Error(\"No handler found for case: \" + args.type);\n }\n return handler.apply(null, args);\n };\n }\n\n Variant.case = caseFunc;\n Variant.on = caseFunc;\n\n return Object.freeze(Variant);\n}\n"],"names":["hasProp","Object","prototype","hasOwnProperty","DEFAULT_HANDLER","getTestFunc","f","str","toString","includes","v","toType","VariantFactory","types","Variant","typeNames","keys","concat","Error","checkArgs","args","caseKey","len","length","validators","x","validator","value","TypeError","name","forEach","type","TypeClosure","caseFunc","cases","Cases","caseKeys","join","TypeCase","Array","slice","call","arguments","apply","handleCaseValue","getType","handler","case","on","freeze"],"mappings":"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"}