module Text.SpellingSuggest.LowLevel (
SpellingWordFilter, SpellingWordCoder,
nearbyWordFilter, anyWordFilter, editDistance,
soundex, phonix, trivialPhoneticCode,
tryWord
) where
import Data.List
import Data.Ord
import Text.EditDistance
import Text.PhoneticCode.Phonix
import Text.PhoneticCode.Soundex
nearbyWordFilter :: String -> String -> Bool
nearbyWordFilter target = (<= 10) . editDistance target
anyWordFilter :: String -> String -> Bool
anyWordFilter = const (const True)
editDistance :: String -> String -> Int
editDistance s t =
restrictedDamerauLevenshteinDistance ec s t where
ec = EditCosts {
insertionCost = 2,
deletionCost = 2,
transpositionCost = 1,
substitutionCost = 3 }
trivialPhoneticCode :: String -> String
trivialPhoneticCode = const ""
type SpellingWordFilter = String -> String -> Bool
type SpellingWordCoder = String -> String
tryWord :: SpellingWordFilter -> SpellingWordCoder ->
String -> [String] -> [String]
tryWord prefilter pcode word =
sortBy (comparing (editDistance word)) .
map snd .
filter ((== pcode word) . fst) .
map sfs .
filter (prefilter word)
where
sfs w = (pcode w, w)