// Type definitions for core/keymap

type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
type Merge<M, N> = Omit<M, Extract<keyof M, keyof N>> & N;

/**
 * Registers  `keyCode`  for  `name` .
 */
export function add(name: string, keyCode: number | number[]): void;
/**
 * Registers  `keyCode`  for  `name` .
 */
export function add(name: string): (keyCode: number | number[]) => void;
/**
 * Registers a set of key codes.
 */
export function addAll(set: { [key: string]: number | number[] }): void;
/**
 * Unregisters  `keyCode`  from  `name` .
 */
export function remove(name: string, keyCode: number | number[]): void;
/**
 * Unregisters  `keyCode`  from  `name` .
 */
export function remove(name: string): (keyCode: number | number[]) => void;
/**
 * Unregisters a set of key codes.
 */
export function removeAll(set: object): void;
/**
 * Determines if  `keyCode`  is mapped to  `name` .
 */
export function is(name: string, keyCode: number): boolean;
/**
 * Determines if  `keyCode`  is mapped to  `name` .
 */
export function is(name: string): (keyCode: number) => boolean;
