UNPKG

unveil

Version:

A React-based Reactive Presentation Framework

154 lines (125 loc) 12.3 kB
'use strict'; var _isNan = require('babel-runtime/core-js/number/is-nan'); var _isNan2 = _interopRequireDefault(_isNan); var _keys = require('babel-runtime/core-js/object/keys'); var _keys2 = _interopRequireDefault(_keys); Object.defineProperty(exports, "__esModule", { value: true }); var _rxjs = require('rxjs'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var createNavigator = function createNavigator(opts) { var stateObservable = opts.stateObservable; var subject = new _rxjs.Subject(); var possibleMotions = []; var directions = {}; /** * Maps motion-names to position in directions array * * @type {[ * left: {level: number, direction: string}, * up: {level: number, direction: string}, * right: {level: number, direction: string}, * down: {level: number, direction: string} * ]} */ var motions = { left: { level: 0, direction: 'previous' }, up: { level: 1, direction: 'previous' }, right: { level: 0, direction: 'next' }, down: { level: 1, direction: 'next' } }; var toPossibleMotions = function toPossibleMotions(directions) { var reduce = function reduce(result, name) { var motion = motions[name]; result[name] = !!(directions[motion.level] && directions[motion.level][motion.direction]); return result; }; return getMotionNames().reduce(reduce, {}); }; /** * Get motion display names * @returns {string[]} Array of possible motions (left, right, down, up) */ var getMotionNames = function getMotionNames() { return (0, _keys2.default)(motions); }; /** * Is direction possible? * @param {string} direction * @returns {boolean} */ var isPossibleMotion = function isPossibleMotion(motion) { return !!possibleMotions[motion]; }; var isValidMotion = function isValidMotion(motion) { return typeof motion === 'string' && getMotionNames().indexOf(motion.toLowerCase()) !== -1; }; var isJumpMotion = function isJumpMotion(motion) { return Array.isArray(motion) && motion.reduce(function (acc, i) { return acc && !(0, _isNan2.default)(Number(i)); }, true); }; var toNumericIndices = function toNumericIndices(motion) { return motion.map(function (i) { return Number(i); }); }; /** * Is state valid? * Tests if state is an array. * @param {*} state * @returns {boolean} */ var isValidState = function isValidState(state) { return Array.isArray(state); }; /** * Get level and direction for motion-string * @param {string} direction * @returns {level, direction} */ var toLevelAndDirection = function toLevelAndDirection(direction) { return motions[direction]; }; /** * Returns new state from motion * @param {level, direction} motion * @returns {number[]|false} */ var toState = function toState(motion) { return directions[motion.level] && directions[motion.level][motion.direction]; }; /** * Get subject to observe navigator changes * @returns {*} */ var asObservable = function asObservable() { return _rxjs.Observable.merge(motionObservable, jumpObservable).filter(isValidState); }; // navigator.next("left"); // navigator.next([0,1]); var next = function next(motion) { subject.next(motion); }; /* * Here's where the magic happens: Observability! */ var motionUpdater = stateObservable.map(toPossibleMotions).subscribe(function (motions) { possibleMotions = motions; }); var directionsUpdater = stateObservable.subscribe(function (_directions) { directions = _directions; }); var motionObservable = subject.filter(isValidMotion).filter(isPossibleMotion).map(toLevelAndDirection).map(toState); var jumpObservable = subject.filter(isJumpMotion).map(toNumericIndices); return { asObservable: asObservable, isPossibleMotion: isPossibleMotion, directions: directions, motionNames: getMotionNames(), next: next }; }; exports.default = createNavigator; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL05hdmlnYXRvci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQSxJQUFJLGtCQUFrQixTQUFsQixlQUFrQixDQUFDLElBQUQsRUFBVTtNQUN4QixrQkFBb0IsS0FBcEIsZ0JBRHdCOztBQUc5QixNQUFJLFVBQVUsbUJBQVYsQ0FIMEI7O0FBSzlCLE1BQUksa0JBQWtCLEVBQWxCLENBTDBCO0FBTTlCLE1BQUksYUFBYSxFQUFiOzs7Ozs7Ozs7Ozs7QUFOMEIsTUFrQjFCLFVBQVU7QUFDWixVQUFPLEVBQUUsT0FBTyxDQUFQLEVBQVUsV0FBVyxVQUFYLEVBQW5CO0FBQ0EsUUFBTyxFQUFFLE9BQU8sQ0FBUCxFQUFVLFdBQVcsVUFBWCxFQUFuQjtBQUNBLFdBQU8sRUFBRSxPQUFPLENBQVAsRUFBVSxXQUFXLE1BQVgsRUFBbkI7QUFDQSxVQUFPLEVBQUUsT0FBTyxDQUFQLEVBQVUsV0FBVyxNQUFYLEVBQW5CO0dBSkUsQ0FsQjBCOztBQXlCOUIsTUFBSSxvQkFBb0IsU0FBcEIsaUJBQW9CLENBQUMsVUFBRCxFQUFnQjtBQUN0QyxRQUFJLFNBQVUsU0FBVixNQUFVLENBQUMsTUFBRCxFQUFTLElBQVQsRUFBa0I7QUFDOUIsVUFBSSxTQUFTLFFBQVEsSUFBUixDQUFULENBRDBCO0FBRTlCLGFBQU8sSUFBUCxJQUFlLENBQUMsRUFBRSxXQUFXLE9BQU8sS0FBUCxDQUFYLElBQTRCLFdBQVcsT0FBTyxLQUFQLENBQVgsQ0FBeUIsT0FBTyxTQUFQLENBQXJELENBQUYsQ0FGYztBQUc5QixhQUFPLE1BQVAsQ0FIOEI7S0FBbEIsQ0FEd0I7O0FBT3RDLFdBQU8saUJBQWlCLE1BQWpCLENBQXdCLE1BQXhCLEVBQWdDLEVBQWhDLENBQVAsQ0FQc0M7R0FBaEI7Ozs7OztBQXpCTSxNQXVDMUIsaUJBQWlCLFNBQWpCLGNBQWlCLEdBQU07QUFDekIsV0FBTyxvQkFBWSxPQUFaLENBQVAsQ0FEeUI7R0FBTjs7Ozs7OztBQXZDUyxNQWdEMUIsbUJBQW1CLFNBQW5CLGdCQUFtQixDQUFDLE1BQUQsRUFBWTtBQUNqQyxXQUFPLENBQUMsQ0FBQyxnQkFBZ0IsTUFBaEIsQ0FBRCxDQUR5QjtHQUFaLENBaERPOztBQW9EOUIsTUFBSSxnQkFBZ0IsU0FBaEIsYUFBZ0IsQ0FBQyxNQUFELEVBQVk7QUFDOUIsV0FBTyxPQUFPLE1BQVAsS0FBa0IsUUFBbEIsSUFDTCxpQkFBaUIsT0FBakIsQ0FBeUIsT0FBTyxXQUFQLEVBQXpCLE1BQW1ELENBQUMsQ0FBRCxDQUZ2QjtHQUFaLENBcERVOztBQXlEOUIsTUFBSSxlQUFlLFNBQWYsWUFBZSxDQUFDLE1BQUQsRUFBWTtBQUM3QixXQUFPLE1BQU0sT0FBTixDQUFjLE1BQWQsS0FBeUIsT0FBTyxNQUFQLENBQWUsVUFBQyxHQUFELEVBQU0sQ0FBTixFQUFZO0FBQ3pELGFBQU8sT0FBTyxDQUFDLHFCQUFjLE9BQU8sQ0FBUCxDQUFkLENBQUQsQ0FEMkM7S0FBWixFQUU1QyxJQUY2QixDQUF6QixDQURzQjtHQUFaLENBekRXOztBQStEOUIsTUFBSSxtQkFBbUIsU0FBbkIsZ0JBQW1CLENBQUMsTUFBRCxFQUFZO0FBQ2pDLFdBQU8sT0FBTyxHQUFQLENBQVksVUFBQyxDQUFEO2FBQU8sT0FBTyxDQUFQO0tBQVAsQ0FBbkIsQ0FEaUM7R0FBWjs7Ozs7Ozs7QUEvRE8sTUF5RTFCLGVBQWUsU0FBZixZQUFlLENBQUMsS0FBRCxFQUFXO0FBQzVCLFdBQU8sTUFBTSxPQUFOLENBQWMsS0FBZCxDQUFQLENBRDRCO0dBQVg7Ozs7Ozs7QUF6RVcsTUFrRjFCLHNCQUFzQixTQUF0QixtQkFBc0IsQ0FBQyxTQUFELEVBQWU7QUFDdkMsV0FBTyxRQUFRLFNBQVIsQ0FBUCxDQUR1QztHQUFmOzs7Ozs7O0FBbEZJLE1BMkYxQixVQUFVLFNBQVYsT0FBVSxDQUFDLE1BQUQsRUFBWTtBQUN4QixXQUFPLFdBQVcsT0FBTyxLQUFQLENBQVgsSUFBNEIsV0FBVyxPQUFPLEtBQVAsQ0FBWCxDQUF5QixPQUFPLFNBQVAsQ0FBckQsQ0FEaUI7R0FBWjs7Ozs7O0FBM0ZnQixNQW1HMUIsZUFBZSxTQUFmLFlBQWUsR0FBTTtBQUN2QixXQUFPLGlCQUFXLEtBQVgsQ0FBaUIsZ0JBQWpCLEVBQW1DLGNBQW5DLEVBQ0osTUFESSxDQUNHLFlBREgsQ0FBUCxDQUR1QjtHQUFOOzs7O0FBbkdXLE1BMEcxQixPQUFPLFNBQVAsSUFBTyxDQUFDLE1BQUQsRUFBWTtBQUNyQixZQUFRLElBQVIsQ0FBYSxNQUFiLEVBRHFCO0dBQVo7Ozs7O0FBMUdtQixNQWlIMUIsZ0JBQWdCLGdCQUNqQixHQURpQixDQUNiLGlCQURhLEVBRWpCLFNBRmlCLENBRU4sVUFBQyxPQUFELEVBQWE7QUFDdkIsc0JBQWtCLE9BQWxCLENBRHVCO0dBQWIsQ0FGVixDQWpIMEI7O0FBdUg5QixNQUFJLG9CQUFvQixnQkFDckIsU0FEcUIsQ0FDVixVQUFDLFdBQUQsRUFBaUI7QUFDM0IsaUJBQWEsV0FBYixDQUQyQjtHQUFqQixDQURWLENBdkgwQjs7QUE0SDlCLE1BQUksbUJBQW1CLFFBQ3BCLE1BRG9CLENBQ2IsYUFEYSxFQUVwQixNQUZvQixDQUViLGdCQUZhLEVBR3BCLEdBSG9CLENBR2hCLG1CQUhnQixFQUlwQixHQUpvQixDQUloQixPQUpnQixDQUFuQixDQTVIMEI7O0FBa0k5QixNQUFJLGlCQUFpQixRQUNsQixNQURrQixDQUNYLFlBRFcsRUFFbEIsR0FGa0IsQ0FFZCxnQkFGYyxDQUFqQixDQWxJMEI7O0FBc0k5QixTQUFPO0FBQ0wsOEJBREs7QUFFTCxzQ0FGSztBQUdMLDBCQUhLO0FBSUwsaUJBQWEsZ0JBQWI7QUFDQSxjQUxLO0dBQVAsQ0F0SThCO0NBQVY7O2tCQStJUCIsImZpbGUiOiJOYXZpZ2F0b3IuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmxldCBjcmVhdGVOYXZpZ2F0b3IgPSAob3B0cykgPT4ge1xuICBsZXQgeyBzdGF0ZU9ic2VydmFibGUgfSA9IG9wdHM7XG5cbiAgbGV0IHN1YmplY3QgPSBuZXcgU3ViamVjdCgpO1xuXG4gIGxldCBwb3NzaWJsZU1vdGlvbnMgPSBbXTtcbiAgbGV0IGRpcmVjdGlvbnMgPSB7fTtcblxuICAvKipcbiAgICogTWFwcyBtb3Rpb24tbmFtZXMgdG8gcG9zaXRpb24gaW4gZGlyZWN0aW9ucyBhcnJheVxuICAgKlxuICAgKiBAdHlwZSB7W1xuICAgKiAgbGVmdDogIHtsZXZlbDogbnVtYmVyLCBkaXJlY3Rpb246IHN0cmluZ30sXG4gICAqICB1cDogICAge2xldmVsOiBudW1iZXIsIGRpcmVjdGlvbjogc3RyaW5nfSxcbiAgICogIHJpZ2h0OiB7bGV2ZWw6IG51bWJlciwgZGlyZWN0aW9uOiBzdHJpbmd9LFxuICAgKiAgZG93bjogIHtsZXZlbDogbnVtYmVyLCBkaXJlY3Rpb246IHN0cmluZ31cbiAgICogXX1cbiAgICovXG4gIGxldCBtb3Rpb25zID0ge1xuICAgIGxlZnQ6ICB7IGxldmVsOiAwLCBkaXJlY3Rpb246ICdwcmV2aW91cycgfSxcbiAgICB1cDogICAgeyBsZXZlbDogMSwgZGlyZWN0aW9uOiAncHJldmlvdXMnIH0sXG4gICAgcmlnaHQ6IHsgbGV2ZWw6IDAsIGRpcmVjdGlvbjogJ25leHQnIH0sXG4gICAgZG93bjogIHsgbGV2ZWw6IDEsIGRpcmVjdGlvbjogJ25leHQnIH1cbiAgfTtcblxuICBsZXQgdG9Qb3NzaWJsZU1vdGlvbnMgPSAoZGlyZWN0aW9ucykgPT4ge1xuICAgIGxldCByZWR1Y2UgID0gKHJlc3VsdCwgbmFtZSkgPT4ge1xuICAgICAgbGV0IG1vdGlvbiA9IG1vdGlvbnNbbmFtZV07XG4gICAgICByZXN1bHRbbmFtZV0gPSAhIShkaXJlY3Rpb25zW21vdGlvbi5sZXZlbF0gJiYgZGlyZWN0aW9uc1ttb3Rpb24ubGV2ZWxdW21vdGlvbi5kaXJlY3Rpb25dKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIHJldHVybiBnZXRNb3Rpb25OYW1lcygpLnJlZHVjZShyZWR1Y2UsIHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbW90aW9uIGRpc3BsYXkgbmFtZXNcbiAgICogQHJldHVybnMge3N0cmluZ1tdfSBBcnJheSBvZiBwb3NzaWJsZSBtb3Rpb25zIChsZWZ0LCByaWdodCwgZG93biwgdXApXG4gICAqL1xuICBsZXQgZ2V0TW90aW9uTmFtZXMgPSAoKSA9PiB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG1vdGlvbnMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBJcyBkaXJlY3Rpb24gcG9zc2libGU/XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkaXJlY3Rpb25cbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBsZXQgaXNQb3NzaWJsZU1vdGlvbiA9IChtb3Rpb24pID0+IHtcbiAgICByZXR1cm4gISFwb3NzaWJsZU1vdGlvbnNbbW90aW9uXTtcbiAgfTtcblxuICBsZXQgaXNWYWxpZE1vdGlvbiA9IChtb3Rpb24pID0+IHtcbiAgICByZXR1cm4gdHlwZW9mIG1vdGlvbiA9PT0gJ3N0cmluZycgJiZcbiAgICAgIGdldE1vdGlvbk5hbWVzKCkuaW5kZXhPZihtb3Rpb24udG9Mb3dlckNhc2UoKSkgIT09IC0xO1xuICB9O1xuXG4gIGxldCBpc0p1bXBNb3Rpb24gPSAobW90aW9uKSA9PiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkobW90aW9uKSAmJiBtb3Rpb24ucmVkdWNlKCAoYWNjLCBpKSA9PiB7XG4gICAgICByZXR1cm4gYWNjICYmICFOdW1iZXIuaXNOYU4oIE51bWJlcihpKSApO1xuICAgIH0sIHRydWUpO1xuICB9O1xuXG4gIGxldCB0b051bWVyaWNJbmRpY2VzID0gKG1vdGlvbikgPT4ge1xuICAgIHJldHVybiBtb3Rpb24ubWFwKCAoaSkgPT4gTnVtYmVyKGkpICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIElzIHN0YXRlIHZhbGlkP1xuICAgKiBUZXN0cyBpZiBzdGF0ZSBpcyBhbiBhcnJheS5cbiAgICogQHBhcmFtIHsqfSBzdGF0ZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGxldCBpc1ZhbGlkU3RhdGUgPSAoc3RhdGUpID0+IHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShzdGF0ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBsZXZlbCBhbmQgZGlyZWN0aW9uIGZvciBtb3Rpb24tc3RyaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkaXJlY3Rpb25cbiAgICogQHJldHVybnMge2xldmVsLCBkaXJlY3Rpb259XG4gICAqL1xuICBsZXQgdG9MZXZlbEFuZERpcmVjdGlvbiA9IChkaXJlY3Rpb24pID0+IHtcbiAgICByZXR1cm4gbW90aW9uc1tkaXJlY3Rpb25dO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG5ldyBzdGF0ZSBmcm9tIG1vdGlvblxuICAgKiBAcGFyYW0ge2xldmVsLCBkaXJlY3Rpb259IG1vdGlvblxuICAgKiBAcmV0dXJucyB7bnVtYmVyW118ZmFsc2V9XG4gICAqL1xuICBsZXQgdG9TdGF0ZSA9IChtb3Rpb24pID0+IHtcbiAgICByZXR1cm4gZGlyZWN0aW9uc1ttb3Rpb24ubGV2ZWxdICYmIGRpcmVjdGlvbnNbbW90aW9uLmxldmVsXVttb3Rpb24uZGlyZWN0aW9uXTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHN1YmplY3QgdG8gb2JzZXJ2ZSBuYXZpZ2F0b3IgY2hhbmdlc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGxldCBhc09ic2VydmFibGUgPSAoKSA9PiB7XG4gICAgcmV0dXJuIE9ic2VydmFibGUubWVyZ2UobW90aW9uT2JzZXJ2YWJsZSwganVtcE9ic2VydmFibGUpXG4gICAgICAuZmlsdGVyKGlzVmFsaWRTdGF0ZSlcbiAgfTtcblxuICAvLyBuYXZpZ2F0b3IubmV4dChcImxlZnRcIik7XG4gIC8vIG5hdmlnYXRvci5uZXh0KFswLDFdKTtcbiAgbGV0IG5leHQgPSAobW90aW9uKSA9PiB7XG4gICAgc3ViamVjdC5uZXh0KG1vdGlvbik7XG4gIH07XG5cbiAgLypcbiAgICogSGVyZSdzIHdoZXJlIHRoZSBtYWdpYyBoYXBwZW5zOiBPYnNlcnZhYmlsaXR5IVxuICAgKi9cbiAgbGV0IG1vdGlvblVwZGF0ZXIgPSBzdGF0ZU9ic2VydmFibGVcbiAgICAubWFwKHRvUG9zc2libGVNb3Rpb25zKVxuICAgIC5zdWJzY3JpYmUoIChtb3Rpb25zKSA9PiB7XG4gICAgICBwb3NzaWJsZU1vdGlvbnMgPSBtb3Rpb25zXG4gICAgfSk7XG5cbiAgbGV0IGRpcmVjdGlvbnNVcGRhdGVyID0gc3RhdGVPYnNlcnZhYmxlXG4gICAgLnN1YnNjcmliZSggKF9kaXJlY3Rpb25zKSA9PiB7XG4gICAgICBkaXJlY3Rpb25zID0gX2RpcmVjdGlvbnNcbiAgICB9KTtcblxuICBsZXQgbW90aW9uT2JzZXJ2YWJsZSA9IHN1YmplY3RcbiAgICAuZmlsdGVyKGlzVmFsaWRNb3Rpb24pXG4gICAgLmZpbHRlcihpc1Bvc3NpYmxlTW90aW9uKVxuICAgIC5tYXAodG9MZXZlbEFuZERpcmVjdGlvbilcbiAgICAubWFwKHRvU3RhdGUpXG5cbiAgbGV0IGp1bXBPYnNlcnZhYmxlID0gc3ViamVjdFxuICAgIC5maWx0ZXIoaXNKdW1wTW90aW9uKVxuICAgIC5tYXAodG9OdW1lcmljSW5kaWNlcylcblxuICByZXR1cm4ge1xuICAgIGFzT2JzZXJ2YWJsZSxcbiAgICBpc1Bvc3NpYmxlTW90aW9uLFxuICAgIGRpcmVjdGlvbnMsXG4gICAgbW90aW9uTmFtZXM6IGdldE1vdGlvbk5hbWVzKCksXG4gICAgbmV4dFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlTmF2aWdhdG9yO1xuIl19