|
'use strict'; |
|
|
|
const { |
|
OBJECT, |
|
FUNCTION, |
|
BOOLEAN, |
|
NUMBER, |
|
STRING, |
|
UNDEFINED, |
|
BIGINT, |
|
SYMBOL, |
|
NULL |
|
} = require('./types.js'); |
|
|
|
const { |
|
defineProperty, |
|
getOwnPropertyDescriptor, |
|
getPrototypeOf, |
|
isExtensible, |
|
ownKeys, |
|
preventExtensions, |
|
set, |
|
setPrototypeOf |
|
} = Reflect; |
|
|
|
const TypedArray = getPrototypeOf(Int8Array); |
|
exports.TypedArray = TypedArray; |
|
|
|
exports.defineProperty = defineProperty; |
|
exports.getOwnPropertyDescriptor = getOwnPropertyDescriptor; |
|
exports.getPrototypeOf = getPrototypeOf; |
|
exports.isExtensible = isExtensible; |
|
exports.ownKeys = ownKeys; |
|
exports.preventExtensions = preventExtensions; |
|
exports.set = set; |
|
exports.setPrototypeOf = setPrototypeOf; |
|
|
|
const augment = (descriptor, how) => { |
|
const {get, set, value} = descriptor; |
|
if (get) descriptor.get = how(get); |
|
if (set) descriptor.set = how(set); |
|
if (value) descriptor.value = how(value); |
|
return descriptor; |
|
}; |
|
exports.augment = augment; |
|
|
|
const entry = (type, value) => [type, value]; |
|
exports.entry = entry; |
|
|
|
const asEntry = transform => value => { |
|
const type = typeof value; |
|
switch (type) { |
|
case OBJECT: |
|
if (value == null) |
|
return entry(NULL, value); |
|
case FUNCTION: |
|
return transform(type, value); |
|
case BOOLEAN: |
|
case NUMBER: |
|
case STRING: |
|
case UNDEFINED: |
|
case BIGINT: |
|
return entry(type, value); |
|
case SYMBOL: { |
|
if (symbols.has(value)) |
|
return entry(type, symbols.get(value)); |
|
} |
|
} |
|
throw new Error(`Unable to handle this ${type} type`); |
|
}; |
|
exports.asEntry = asEntry; |
|
|
|
const symbols = new Map( |
|
ownKeys(Symbol) |
|
.filter(s => typeof Symbol[s] === SYMBOL) |
|
.map(s => [Symbol[s], s]) |
|
); |
|
|
|
const symbol = value => { |
|
for (const [symbol, name] of symbols) { |
|
if (name === value) |
|
return symbol; |
|
} |
|
}; |
|
exports.symbol = symbol; |
|
|