UNPKG

mezzanine

Version:

Fantasy land union types with pattern matching

241 lines (153 loc) 5.23 kB
'use strict';Object.defineProperty(exports, "__esModule", { value: true }); var _ramda = require('ramda'); var _toFastProps = require('../to-fast-props');var _toFastProps2 = _interopRequireDefault(_toFastProps); var _fixtures = require('./fixtures'); var _config = require('../config'); var _descriptor = require('./descriptor'); require('./index.h'); var _props = require('../utils/props'); var _virtualStack = require('../virtual-stack'); var _properties = require('./properties');function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} function isType(pred, uniqMark, isMono, stack) { var needTransform = stack.length !== 0; return function checkIsType(obj) { var val = obj; if (needTransform === true) { var initial = (0, _virtualStack.getInitialValue)(stack, val); if (initial.succ === false) return false; val = initial.val; } var data = (0, _descriptor.transformInput)(val, isMono); if (data == null) return false; if (isMono && (0, _fixtures.isMezzanine)(data.value) && data.value.ಠ_ಠ === uniqMark) return true; return pred(data); }; } var newUniqMark = name => Symbol(name); var generalInjectableProps = { clone: (_, Static) => () => { var { name, typeName, desc, func, stack } = Static; return makeContainer(name, typeName, desc, func, stack); }, //$FlowIssue [_config.typeMark]: { get: () => true, enumerable: false } }; var staticInjectableProps = { //$FlowIssue [Symbol.hasInstance]: Static => val => Static.is(val), stackUpdate: Static => newStack => { var { name, typeName, desc, func } = Static; return makeContainer(name, typeName, desc, func, newStack); } }; var fullStaticProps = (0, _props.injector)([ generalInjectableProps, staticInjectableProps, _properties.fantasyOnClass]); var fullInstanceProps = (0, _props.injector)([ generalInjectableProps, _properties.instanceInjectableProps, _properties.fantasyInstance]); function makeContainer( name, typeName, descriptor, func, stack = [] //$FlowIssue ) { var desc = typeof descriptor !== 'object' || descriptor == null ? { value: descriptor } : descriptor; var keys = Object.keys(desc); var pred = (0, _descriptor.createPred)(desc); var isMono = keys.length === 1 && keys[0] === 'value'; var uniqMark = newUniqMark(name); var checkIs = isType(pred, uniqMark, isMono, stack); function RecordFn(arg) { //$FlowIssue if (new.target == null) return new RecordFn(arg); var obj = (0, _virtualStack.applyStack)(stack, arg); var data = (0, _descriptor.transformInput)(obj, isMono); if (data == null) { throw new TypeError(`${name}{isMono: ${isMono.toString()}}: No value recieved`); } if (isMono && (0, _fixtures.isMezzanine)(data.value) && data.value.ಠ_ಠ === uniqMark) return data.value; if (!pred(data)) { var mono = isMono.toString(); var keysList = Object.keys(data).toString(); var valuesList = (0, _ramda.values)(data).toString(); var message = `${name}{isMono: ${mono}}: Unsafe pattern mismatch\nKeys: ${keysList}\nValues: ${valuesList}`; throw new TypeError(message); } var dataResult = (0, _descriptor.createBuilder)(desc, data); // console.log(data, obj, dataResult) for (var _iterator = keys, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {var _ref;if (_isArray) {if (_i >= _iterator.length) break;_ref = _iterator[_i++];} else {_i = _iterator.next();if (_i.done) break;_ref = _i.value;}var key = _ref; this[key] = dataResult[key]; // console.log(this[key]) } fullInnerInstProps(this, RecordFn); fullInstanceProps(this, RecordFn); (0, _toFastProps2.default)(this); } var generalProps = { ಠ_ಠ: { value: uniqMark, enumerable: false }, type: { value: name, enumerable: true }, keys: { value: keys, enumerable: false }, isMono: { get: () => isMono, enumerable: false }, is: { value: checkIs, enumerable: true } }; var staticProps = { name: { value: name, enumerable: false }, typeName: { value: typeName, enumerable: false }, desc: { value: descriptor, enumerable: false }, func: { value: func, enumerable: false }, stack: { value: stack, enumerable: false } }; var instProps = { typeName: { value: typeName, enumerable: true } }; var fullInnerStaticProps = (0, _props.injector)([ generalProps, staticProps]); var userMeth = getUserMethods(func); var fullInnerInstProps = (0, _props.injector)([ generalProps, instProps, userMeth]); fullInnerStaticProps(RecordFn, RecordFn); fullStaticProps(RecordFn, RecordFn); return RecordFn; } var getUserMethods = func => Object.getOwnPropertyNames(func) //$FlowIssue .concat(Object.getOwnPropertySymbols(func)). map(key => [key, { value: func[key], enumerable: true, writable: true, inject: true }]);exports.default = makeContainer; //# sourceMappingURL=type-container.js.map