Started rewrite
parent
1550f1b228
commit
da63b2841d
|
@ -0,0 +1,116 @@
|
|||
// This code isn't for feeble minds, you might not understand it Dr. Transmisia.
|
||||
// The dainty hands of a trans goddess wrote this code. Watch the way her fingers
|
||||
// dance across the keyboard and learn.
|
||||
|
||||
/**
|
||||
* @typedef {object} EmojiDef
|
||||
* @property {number} author_id
|
||||
* @property {string} author_original_username
|
||||
* @property {string} author_username
|
||||
* @property {number} count
|
||||
* @property {number} created_utc
|
||||
* @property {string} kind
|
||||
* @property {string} name
|
||||
* @property {number | null} submitter_id
|
||||
* @property {string[]} tags
|
||||
*/
|
||||
|
||||
/** Returns a promise which can be used to await when the event loop is idle. */
|
||||
const idle = () => {
|
||||
return new Promise(resolve => {
|
||||
requestIdleCallback(resolve);
|
||||
});
|
||||
}
|
||||
|
||||
class TagDict {
|
||||
/**
|
||||
* @type {Map<string,Set<string>>}
|
||||
* @private
|
||||
*/
|
||||
_map = new Map();
|
||||
|
||||
/**
|
||||
* @param {string} tag
|
||||
*/
|
||||
get = (tag) => {
|
||||
const set = this._map.get(tag);
|
||||
|
||||
if (!set) {
|
||||
const newSet = new Set();
|
||||
this._map.set(tag, newSet);
|
||||
return newSet;
|
||||
} else {
|
||||
return set;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} tag
|
||||
* @param {string} emojiName
|
||||
*/
|
||||
add = (tag, emojiName) => {
|
||||
this.get(tag).add(emojiName);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} tag
|
||||
* @param {string} emojiName
|
||||
*/
|
||||
delete = (tag, emojiName) => {
|
||||
this.get(tag).delete(emojiName);
|
||||
}
|
||||
|
||||
/**
|
||||
* If emojiName is not provided, returns whether the tag exists.
|
||||
* Otherwise, returns whether the tag contains the emoji.
|
||||
* @param {string} tag
|
||||
* @param {string} [emojiName]
|
||||
*/
|
||||
has = (tag, emojiName) => {
|
||||
if (emojiName) {
|
||||
return this.get(tag).has(emojiName);
|
||||
} else {
|
||||
return this._map.has(tag);
|
||||
}
|
||||
}
|
||||
|
||||
[Symbol.iterator] = () => this._map[Symbol.iterator]();
|
||||
}
|
||||
|
||||
class EmojiEngine {
|
||||
tags = new TagDict();
|
||||
|
||||
/**
|
||||
* @param {EmojiDef[]} emojis
|
||||
*/
|
||||
init = async (emojis) => {
|
||||
for (const emoji of emojis) {
|
||||
this.tags.add(emoji.name, emoji.name);
|
||||
|
||||
for (const tag of emoji.tags) {
|
||||
this.tags.add(tag, emoji.name);
|
||||
}
|
||||
|
||||
// I left out tagging by author... lets see if anyone complains...
|
||||
}
|
||||
}
|
||||
|
||||
search = async(query) => {
|
||||
if (query?.length < 2) {
|
||||
return new Set();
|
||||
}
|
||||
|
||||
const results = new Set();
|
||||
for (const [tag, names] of this.tags) {
|
||||
if (tag.includes(query) || query.includes(tag)) {
|
||||
for (const name of names) {
|
||||
results.add(name);
|
||||
}
|
||||
}
|
||||
}
|
||||
return results;
|
||||
}
|
||||
}
|
||||
|
||||
const emojiEngine = new EmojiEngine();
|
||||
emojiEngine.init();
|
Loading…
Reference in New Issue