import 'dart:math'; /// One spelling challenge: a displayed word and whether it is spelled correctly. class SpellingChallenge { const SpellingChallenge({ required this.displayedWord, required this.isCorrectlySpelled, required this.canonicalWord, }); final String displayedWord; final bool isCorrectlySpelled; final String canonicalWord; } /// Curated commonly misspelled words for spelling quizzes. abstract final class SpellingWordList { static const List<({String correct, String misspelled})> pairs = <({String correct, String misspelled})>[ (correct: 'accommodate', misspelled: 'acommodate'), (correct: 'separate', misspelled: 'seperate'), (correct: 'definitely', misspelled: 'definately'), (correct: 'occurrence', misspelled: 'occurence'), (correct: 'embarrass', misspelled: 'embarass'), (correct: 'maintenance', misspelled: 'maintainance'), (correct: 'recommend', misspelled: 'reccomend'), (correct: 'privilege', misspelled: 'priviledge'), (correct: 'necessary', misspelled: 'neccessary'), (correct: 'rhythm', misspelled: 'rythm'), ]; /// Known misspelling from the curated list, if any. static String? misspellingFor(String canonicalWord) { final String normalized = canonicalWord.trim().toLowerCase(); for (final ({String correct, String misspelled}) pair in pairs) { if (pair.correct == normalized) { return pair.misspelled; } } return null; } /// Fallback typo when [misspellingFor] has no curated entry. static String generatedMisspelling(String canonicalWord) { return misspellingFor(canonicalWord) ?? _naiveMisspelling(canonicalWord); } static String _naiveMisspelling(String word) { final String lower = word.trim().toLowerCase(); if (lower.length <= 2) { return '${lower}x'; } final int dropAt = lower.length ~/ 2; return lower.substring(0, dropAt) + lower.substring(dropAt + 1); } static SpellingChallenge randomChallenge([Random? random]) { final Random rng = random ?? Random(); final ({String correct, String misspelled}) pair = pairs[rng.nextInt(pairs.length)]; final bool showCorrect = rng.nextBool(); return SpellingChallenge( displayedWord: showCorrect ? pair.correct : pair.misspelled, isCorrectlySpelled: showCorrect, canonicalWord: pair.correct, ); } }