{"version":3,"sources":["jsdelivr-header.js","/npm/markov-chain-generator@0.3.0/src/MarkovChain/index.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,ACNA,aAEA,MAAM,UAAY,QAAQ,gBAO1B,MAAM,YAQF,WAAA,CAAY,GAER,GADA,KAAK,MAAQ,KACR,EACD,MAAM,IAAI,MAAM,+DAEpB,KAAK,UAAY,UACjB,KAAK,KAAO,KAAK,UAAU,SAAS,EACxC,CAUA,iBAAA,CAAkB,GACd,QAAoB,IAAT,IAAiC,IAAT,GAA2B,OAAT,EACjD,OAAO,EAEX,MAAM,EAAO,KAAK,SACZ,EAAM,GAEZ,IAAI,EAAM,EAAK,QAAQ,GACvB,MAAgB,IAAT,GACC,EAAK,EAAM,IACX,EAAI,KAAK,EAAK,EAAM,IAExB,EAAM,EAAK,QAAQ,EAAM,EAAM,GAGnC,OAAO,CACX,CASA,YAAI,GACA,OAAO,KAAK,UAAU,SAAS,KAAK,KACxC,CAUA,cAAA,CAAe,GACX,MAAM,EAAO,KAAK,SAClB,IAAI,EAAO,EAAK,KAAK,MAAM,EAAK,OAAS,KAAK,WAE9C,IAAe,IAAX,EAAkB,CAClB,IAAI,EAAU,QACd,MAAQ,EAAK,OAAO,GAAG,MAAM,IACzB,EAAO,EAAK,KAAK,MAAM,EAAK,OAAS,KAAK,UAElD,CAEA,OAAO,CACX,CAUA,YAAA,CAAa,GACT,IAAK,EACD,OAAO,EAEX,MAAM,EAAmB,KAAK,kBAAkB,GAChD,OAAO,EAAiB,KAAK,MAAM,EAAiB,OAAS,KAAK,UACtE,CAUA,QAAA,CAAS,GACL,OAAO,EAAK,OAAO,GAAG,cAAgB,EAAK,MAAM,EACrD,CAWA,QAAA,CAAS,EAAW,GAChB,EAAQ,GAAS,KAAK,MACtB,MAAM,EAAQ,GAEd,IAAI,EAAS,EACb,MAAQ,GACJ,EAAY,KAAK,eAAe,GAEpC,EAAM,KAAK,GACX,IAAI,EAAW,KAAK,aAAa,GACjC,GACI,EAAM,KAAK,GACX,EAAW,EAAM,OAAS,GAAQ,KAAK,aAAa,SAC/C,GAET,OAAO,KAAK,UAAU,QAAQ,EAClC,EAGJ,OAAO,QAAU","file":"/npm/markov-chain-generator@0.3.0/src/MarkovChain/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/markov-chain-generator@0.3.0/src/MarkovChain/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","'use strict'\n\nconst Tokenizer = require('../Tokenizer')\n\n/**\n * \n * \n * @class MarkovChain\n */\nclass MarkovChain {\n    /**\n     * Creates an instance of MarkovChain.\n     * \n     * @param {String} seed\n     * \n     * @memberOf MarkovChain\n     */\n    constructor(seed) {\n        this.limit = 100\n        if (!seed) {\n            throw new Error('The MarkovChain class cannot be instantiated without a seed')\n        }\n        this.tokenizer = Tokenizer\n        this.seed = this.tokenizer.sanitize(seed)\n    }\n\n    /**\n     * Creates a probability array for a given word\n     * \n     * @param {String} word The word for which the probability array is to be created\n     * @returns {Array} The array of possible next words\n     * \n     * @memberOf MarkovChain\n     */\n    _probabilityArray(word) {\n        if (typeof word === 'undefined' || word === false || word === null) {\n            return false\n        }\n        const list = this.wordList\n        const res = []\n\n        let idx = list.indexOf(word)\n        while (idx !== -1) {\n            if (list[idx + 1]) {\n                res.push(list[idx + 1])\n            }\n            idx = list.indexOf(word, idx + 1)\n        }\n\n        return res\n    }\n\n    /**\n     * Strips new lines from seed and generates an array\n     * \n     * @readonly\n     * \n     * @memberOf MarkovChain\n     */\n    get wordList() {\n        return this.tokenizer.tokenize(this.seed)\n    }\n\n    /**\n     * Gets a random word\n     * \n     * @param {any} strict If === false, return the first token. Otherwise, return an uppercase word\n     * @returns {String} A random word from the word list\n     * \n     * @memberOf MarkovChain\n     */\n    _getRandomWord(strict) {\n        const list = this.wordList\n        let word = list[Math.floor(list.length * Math.random())]\n\n        if (strict !== false) {\n            let pattern = /[A-Z]/\n            while (!word.charAt(0).match(pattern)) {\n                word = list[Math.floor(list.length * Math.random())]\n            }\n        }\n\n        return word\n    }\n\n    /**\n     * Method for returning a word\n     * \n     * @param {String} word\n     * @returns {String|Boolean} A word. Alternatively, boolean false\n     * \n     * @memberOf MarkovChain\n     */\n    _getNextWord(word) {\n        if (!word) {\n            return false\n        }\n        const probabilityArray = this._probabilityArray(word)\n        return probabilityArray[Math.floor(probabilityArray.length * Math.random())]\n    }\n\n    /**\n     * Method for capitalizing the first letter of a word\n     * \n     * @param {String} word\n     * @returns {String} The formatted word\n     * \n     * @memberOf MarkovChain\n     */\n    _ucfirst(word) {\n        return word.charAt(0).toUpperCase() + word.slice(1)\n    }\n\n    /**\n     * Method for generating a Markov chain\n     * \n     * @param {String|Boolean} firstWord The word to start the Markov chain; if false, strict mode is overriden\n     * @param {Number} limit The maximum number of words for the Markov chain\n     * @returns {String}\n     * \n     * @memberOf MarkovChain\n     */\n    generate(firstWord, limit) {\n        limit = limit || this.limit\n        const chain = []\n\n        let strict = firstWord\n        while (!firstWord) {\n            firstWord = this._getRandomWord(strict)\n        }\n        chain.push(firstWord)\n        let nextWord = this._getNextWord(firstWord)\n        do {\n            chain.push(nextWord)\n            nextWord = chain.length < limit ? this._getNextWord(nextWord) : false\n        } while (nextWord)\n\n        return this.tokenizer.rebuild(chain)\n    }\n}\n\nmodule.exports = MarkovChain\n"]}