!7 concept ColorName { S color, name, comment; } module ColorNames > DynCRUD { *() { super(ColorName); } start { onConceptsChangeAndNow(r { setModuleName("Names Of Colors (" + countConcepts(ColorName) + ")") }); } // API void addColorName(Color color, S name, S comment) { uniq_sync(ColorName, color := colorToHex(color), +name, +comment); } S getClosestColorName(Color color) { ret pairA(getClosestColor(color)); } Pair getClosestColor(Color color) { new Lowest best; for (ColorName cn) best.put(cn.name, colorDiff(color, colorFromHex(cn.color))); ret pair(best!, best.score()); } }