MAL manga default search

Make MyAnimelist search work faster for adding manga.

// ==UserScript==
// @name         MAL manga default search
// @namespace    http://tampermonkey.net/
// @version      2024-03-08
// @description  Make MyAnimelist search work faster for adding manga.
// @copyright    2024, Santeri Hetekivi (https://github.com/SanteriHetekivi)
// @license      Apache-2.0
// @author       Santeri Hetekivi
// @match        https://myanimelist.net/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=myanimelist.net
// @grant        none
// ==/UserScript==

(function () {
    'use strict';
    // Base timeout.
    const TIMEOUT_MS = 100

    // Id for select element.
    const ID_SELECT = "topSearchValue"

    // Id for text input element.
    const ID_TEXT_INPUT = "topSearchText"

    /**
     * Get element by id.
     * @param {string} id For this id.
     * @param {function} callback Function to call with element.
     * @param {?string} key If given, use this key for data.
     */
    function getElementById(id, callback, key) {
        // Get element by id.
        const element = document.getElementById(id)

        // Init data.
        if (typeof getElementById.data !== "object") {
            getElementById.data = {}
        }

        // If key is undefined
        if (typeof key === "undefined") {
            // generate key that is not in use.
            do {
                key = (Math.random() + 1).toString(36).substring(2)
            } while (key in getElementById.data)
        }
        // Else if key is not in use
        else if (!(key in getElementById.data)) {
            // throw error.
            throw new Error("Key '" + key + "' not found in getElementById.data!")
        }

        // Key has data.
        const keyHasData = (typeof getElementById.data[key] === "object")

        // If element found.
        if (element) {
            // If key has data
            if (keyHasData) {
                // and timeout is number
                if (typeof getElementById.data[key].timeout === "number") {
                    // clear timeout.
                    clearTimeout(getElementById.data[key].timeout)
                }
                // delete data for key.
                delete getElementById.data[key]
            }
            // Callback with element.
            callback(element)
        }
        // Else if element not found.
        else {
            // If key has no data
            if (!keyHasData) {
                // init data.
                getElementById.data[key] = { counter: 0, timeout: null }
            }
            // After timeout
            getElementById.data[key].timeout = setTimeout(
                function () {
                    // call again with same key.
                    getElementById(id, callback, key)
                },
                (
                    // Wait base timeout
                    TIMEOUT_MS
                    *
                    // times updated counter.
                    (getElementById.data[key].counter++)
                )
            )
        }
    }
    // Get select element and
    getElementById(
        ID_SELECT,
        function (element) {
            // set value to manga.
            element.value = "manga"
        }
    )
    // Get text input element and
    getElementById(
        ID_TEXT_INPUT,
        function (element) {
            // focus on it.
            element.focus()
        }
    )
})();