@algebraic/type
Advanced tools
11
data.js
@@ -6,3 +6,3 @@ const { declaration, fNamed, is, getTypename } = require("./declaration"); | ||
const fNameRegExp = /([^=\s]+)\s*=>/; | ||
const fNameRegExp = /([^=\s]+)\s*=>/;///(?:^function\s+(?:[^\(\s]*)\(([^\s]+)\))|([^=\s]+)\s*=>/; | ||
const fNameParse = f => fNameRegExp.exec(f + "")[1]; | ||
@@ -18,2 +18,4 @@ const fWithDefault = definition => isArray(definition) ? | ||
const GetFieldsSymbol = Symbol("GetFields"); | ||
exports.data = declaration(function data (type, fieldDefinitions) | ||
@@ -35,2 +37,4 @@ { | ||
type[GetFieldsSymbol] = () => []; | ||
return { is, create, serialize, deserialize }; | ||
@@ -69,2 +73,3 @@ } | ||
type.prototype.toString = function () { return inspect(this) }; | ||
type[GetFieldsSymbol] = getChildren; | ||
@@ -78,2 +83,6 @@ const is = value => value instanceof type; | ||
exports.data.fields = function (type) | ||
{ | ||
return type[GetFieldsSymbol]().map(([name, [type]]) => [name, type]); | ||
} | ||
@@ -80,0 +89,0 @@ function toSerialize(typename, getChildren) |
@@ -15,2 +15,3 @@ const typenameStack = []; | ||
const DeserializeSymbol = Symbol("deserialize"); | ||
const KindSymbol = Symbol("kind"); | ||
const UUIDSymbol = Symbol("uuid"); | ||
@@ -21,35 +22,45 @@ | ||
{ | ||
return fNamed(f.name, function ([typename]) | ||
const kind = fNamed(f.name, function (...args) | ||
{ | ||
const typename = toTypename(...args); | ||
typenameStack.push(typename); | ||
const scoped = typenameStack.join("."); | ||
const UUID = generateUUID(scoped, 2); | ||
return fNamed(`[declare ${scoped}]`, function (...args) | ||
{ | ||
if (hasOwnProperty.call(types, UUID)) | ||
throw TypeError(`Duplicate Type Declaration for ${scoped}`); | ||
const type = types[UUID] = fNamed(scoped, function (...args) | ||
try | ||
{ | ||
return create.apply(this, args); | ||
}); | ||
if (hasOwnProperty.call(types, UUID)) | ||
throw TypeError(`Duplicate Type Declaration for ${scoped}`); | ||
type[TypenameSymbol] = scoped; | ||
type[UnscopedTypenameSymbol] = typename; | ||
type[InspectSymbol] = () => `[${f.name} ${scoped}]`; | ||
type[UUIDSymbol] = UUID; | ||
type.toString = () => `[${f.name} ${scoped}]`; | ||
const type = types[UUID] = fNamed(scoped, function (...args) | ||
{ | ||
return create.apply(this, args); | ||
}); | ||
const { is, create, serialize, deserialize } = f(type, args); | ||
type[TypenameSymbol] = scoped; | ||
type[UnscopedTypenameSymbol] = typename; | ||
type[InspectSymbol] = () => `[${f.name} ${scoped}]`; | ||
type[UUIDSymbol] = UUID; | ||
type.toString = () => `[${f.name} ${scoped}]`; | ||
type[IsSymbol] = is; | ||
type[SerializeSymbol] = serialize; | ||
type[DeserializeSymbol] = deserialize; | ||
const { is, create, serialize, deserialize } = f(type, args); | ||
typenameStack.pop(); | ||
type[IsSymbol] = is; | ||
type[SerializeSymbol] = serialize; | ||
type[DeserializeSymbol] = deserialize; | ||
type[KindSymbol] = kind; | ||
return type; | ||
return type; | ||
} | ||
finally | ||
{ | ||
typenameStack.pop(); | ||
} | ||
}); | ||
}); | ||
return kind; | ||
} | ||
@@ -61,2 +72,10 @@ | ||
function toTypename(strings, ...args) | ||
{ | ||
const asTypename = object => !!object ? getTypename(object) : object; | ||
return args.reduce((typename, arg, index) => | ||
typename + asTypename(arg) + strings[index + 1], strings[0]); | ||
} | ||
function declare({ is, create, typename, unscopedTypename, serialize, deserialize }) | ||
@@ -69,2 +88,3 @@ { | ||
type[UUIDSymbol] = generateUUID(typename, 2); | ||
type[TypenameSymbol] = typename; | ||
@@ -131,2 +151,7 @@ type[UnscopedTypenameSymbol] = unscopedTypename || typename; | ||
module.exports.getKind = function (type) | ||
{ | ||
return type[KindSymbol] || false; | ||
} | ||
module.exports.fNamed = fNamed; | ||
@@ -133,0 +158,0 @@ |
{ | ||
"name": "@algebraic/type", | ||
"version": "1.0.0-alpha.3", | ||
"version": "1.0.0-alpha.4", | ||
"description": "", | ||
@@ -5,0 +5,0 @@ "main": "type.js", |
@@ -16,35 +16,52 @@ const { declaration, getTypename, fNamed } = require("./declaration"); | ||
exports.boolean = primitive `boolean` ( | ||
[value => value ? 1 : 0, true], | ||
serialized => !!serialized ); | ||
const specials = { n: NaN, z: -0, s: -Infinity, b: Infinity }; | ||
exports.number = primitive `number` ( | ||
[value => | ||
// NaN | ||
value !== value ? "n" : | ||
// -0 | ||
value === 0 && 1 / value === -Infinity ? "z" : | ||
// -Infinity | ||
value === -Infinity ? "s" : | ||
// Infinity | ||
value === Infinity ? "b" : value, true], | ||
serialized => specials[serialized] || serialized ); | ||
const primitives = | ||
{ | ||
boolean: primitive `boolean` ( | ||
[value => value ? 1 : 0, true], | ||
serialized => !!serialized ), | ||
exports.string = primitive `string` ( | ||
[value => value, false], | ||
serialized => serialized); | ||
number: primitive `number` ( | ||
[value => | ||
// NaN | ||
value !== value ? "n" : | ||
// -0 | ||
value === 0 && 1 / value === -Infinity ? "z" : | ||
// -Infinity | ||
value === -Infinity ? "s" : | ||
// Infinity | ||
value === Infinity ? "b" : value, true], | ||
serialized => specials[serialized] || serialized ), | ||
exports.regexp = primitive `regexp` ( | ||
[value => [value.source, | ||
(value.global ? "g" : "") + | ||
(value.multiline ? "m" : "") + | ||
(value.ignoreCase ? "i" : "") + | ||
(value.sticky ? "y" : "") + | ||
(value.unicode ? "u" : "")], false], | ||
serialized => RegExp(...serialized)); | ||
string: primitive `string` ( | ||
[value => value, false], | ||
serialized => serialized), | ||
exports.ftype = primitive `function` ( | ||
[value => { throw TypeError("Cannot serialize function") }, false], | ||
serialized => { throw TypeError("Cannot deserialize function") } ); | ||
regexp: primitive `regexp` ( | ||
[value => [value.source, | ||
(value.global ? "g" : "") + | ||
(value.multiline ? "m" : "") + | ||
(value.ignoreCase ? "i" : "") + | ||
(value.sticky ? "y" : "") + | ||
(value.unicode ? "u" : "")], false], | ||
serialized => RegExp(...serialized)), | ||
ftype: primitive `function` ( | ||
[value => { throw TypeError("Cannot serialize function") }, false], | ||
serialized => { throw TypeError("Cannot deserialize function") } ) | ||
} | ||
URL.prototype.equals = function (rhs) | ||
{ | ||
return this === rhs || this.hashCode() === rhs.hashCode(); | ||
} | ||
URL.prototype.hashCode = function () | ||
{ | ||
return this.href; | ||
} | ||
primitives.primitives = { ...primitives }; | ||
module.exports = primitives; |
@@ -9,3 +9,4 @@ | ||
...require("./serialize"), | ||
...require("./deserialize") | ||
...require("./deserialize"), | ||
...require("./parameterized") | ||
}; |
@@ -15,3 +15,5 @@ const { fNamed, declaration, getTypename, getUnscopedTypename, is } = require("./declaration"); | ||
const ComponentsSymbol = Symbol("Components"); | ||
exports.union = declaration(function union (type, declarations) | ||
@@ -41,5 +43,12 @@ { | ||
type[ComponentsSymbol] = types; | ||
return { is: unionIs, create, serialize, deserialize }; | ||
}); | ||
exports.union.components = function (type) | ||
{ | ||
return type[ComponentsSymbol]; | ||
} | ||
/* | ||
@@ -46,0 +55,0 @@ const fCreate = (f, properties) => |
15836
26.63%9
12.5%424
29.66%