@enact/core
Version:
Enact is an open source JavaScript framework containing everything you need to create a fast, scalable mobile or web application.
188 lines (177 loc) • 4.46 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.removeAll = exports.remove = exports.is = exports.addAll = exports.add = void 0;
var _curry = _interopRequireDefault(require("ramda/src/curry"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
/*
* The singleton map of names to keyCodes. If a name doesn't have any keyCodes mapped to it, it will
* not exist in this map. If it does, its value will be an array of its keyCodes.
*
* @type {Object}
* @private
*/
var map = {};
/*
* Safely converts keymap name to lowercase.
*
* @function
* @param {String} name Name for keyCode
*
* @returns {String} Name for keyCode in lowercase
* @memberof core/keymap
* @private
*/
var toLowerCase = function toLowerCase(name) {
return name ? name.toLowerCase() : '';
};
/*
* Iterates over `set` and invokes `fn` with the key and value of each item.
*
* @function
* @param {Function} fn Function to invoke
* @param {Object} set A map of names to keyCodes
*
* @returns {undefined}
* @memberof core/keymap
* @private
*/
var forEachObj = (0, _curry["default"])(function (fn, set) {
Object.keys(set).forEach(function (name) {
return fn(name, set[name]);
});
});
/*
* Invokes `fn` with `name` and `keyCode` for each key code provided.
*
* @function
* @param {Function} fn Function to invoke
* @param {String} name Name for the key codes
* @param {Number|Number[]} keyCode A key code or array of key codes
*
* @returns {undefined}
* @curried
* @memberof core/keymap
* @private
*/
var oneOrArray = (0, _curry["default"])(function (fn, name, keyCode) {
if (Array.isArray(keyCode)) {
keyCode.forEach(fn(name));
} else {
fn(name, keyCode);
}
});
/*
* Adds `keyCode` to `name`.
*
* @function
* @param {String} name Name for the key code
* @param {Number} keyCode A key code
*
* @returns {undefined}
* @curried
* @memberof core/keymap
* @private
*/
var addOne = (0, _curry["default"])(function (name, keyCode) {
name = toLowerCase(name);
if (name in map) {
var index = map[name].indexOf(keyCode);
if (index === -1) {
map[name].push(keyCode);
}
} else if (name) {
map[name] = [keyCode];
}
});
/*
* Removes `keyCode` from `name`.
*
* @function
* @param {String} name Name for the key code
* @param {Number} keyCode A key code
*
* @returns {undefined}
* @curried
* @memberof core/keymap
* @private
*/
var removeOne = (0, _curry["default"])(function (name, keyCode) {
name = toLowerCase(name);
if (name in map) {
var keys = map[name];
var index = keys.indexOf(keyCode);
if (index === -1) {
delete map[name];
} else {
keys.splice(index, 1);
}
}
});
/**
* Registers `keyCode` for `name`.
*
* @function add
* @param {String} name Name for the key code
* @param {Number|Number[]} keyCode A key code or array of key codes
*
* @returns {undefined}
* @curried
* @memberof core/keymap
* @public
*/
var add = exports.add = oneOrArray(addOne);
/**
* Registers a set of key codes.
*
* @function addAll
* @param {Object<String,Number|Number[]>} set A map of names to keyCodes
*
* @returns {undefined}
* @curried
* @memberof core/keymap
* @public
*/
var addAll = exports.addAll = forEachObj(add);
/**
* Unregisters `keyCode` from `name`.
*
* @function remove
* @param {String} name Name for the key code
* @param {Number|Number[]} keyCode A key code or array of key codes
*
* @returns {undefined}
* @curried
* @memberof core/keymap
* @public
*/
var remove = exports.remove = oneOrArray(removeOne);
/**
* Unregisters a set of key codes.
*
* @function removeAll
* @param {Object} set A map of names to keyCodes
*
* @returns {undefined}
* @curried
* @memberof core/keymap
* @public
*/
var removeAll = exports.removeAll = forEachObj(remove);
/**
* Determines if `keyCode` is mapped to `name`.
*
* @function is
* @param {String} name Name for the key code
* @param {Number} keyCode A key code
*
* @returns {Boolean} `true` if `keyCode` is mapped to `name`
* @curried
* @memberof core/keymap
* @public
*/
var is = exports.is = (0, _curry["default"])(function (name, keyCode) {
name = toLowerCase(name);
return name in map && map[name].indexOf(keyCode) >= 0;
});