!7 concept Emoji { S unicode; S description; S keywords; // with plus S posNeg; // positive/negative? } cmodule EmojisCRUD > DynCRUD { start { dbIndexing(Emoji, 'unicode); dm_registerAs('emojisCRUD); } // API Emoji addEmoji(S unicode) { Emoji e = uniq_sync(Emoji, +unicode); if (empty(e.keywords)) cset(e, keywords := joinWithSpacedPlus(simpleUnicodeEmojiList().get(unicode))); ret e; } S getPosNeg(S unicode) { ret getString posNeg(conceptWhere(Emoji, +unicode)); } S getKeywords(S unicode) { ret getString keywords(conceptWhere(Emoji, +unicode)); } void setPosNeg(S unicode, S posNeg) { cset(addEmoji(unicode), +posNeg); } LPair emojisWithPosNeg() { ret map(func(Emoji e) -> PairS { pair(e.unicode, e.posNeg) }, [Emoji e : list(Emoji) | nempty(e.posNeg)]); } }