module Text.Morse (
morseCode,
toMorseCode
) where
import Data.Char
import Data.Map (Map)
import qualified Data.Map as M
morseCode :: Map Char String
morseCode =
M.fromList
[('a', ".-")
,('b', "-...")
,('c', "-.-.")
,('d', "-..")
,('e', ".")
,('f', "..-.")
,('g', "--.")
,('h', "....")
,('i', "..")
,('j', ".---")
,('k', "-.-")
,('l', ".-..")
,('m', "--")
,('n', "-.")
,('o', "---")
,('p', ".--.")
,('q', "--.-")
,('r', ".-.")
,('s', "...")
,('t', "-")
,('u', "..-")
,('v', "...-")
,('w', ".--")
,('x', "-..-")
,('y', "-.--")
,('z', "--..")
,('=', "-...-")
,('?', "..--..")
,('/', "-..-.")
,(',', "--..--")
,('.', ".-.-.-")
,(':', "---...")
,('\'', ".----.")
,('-', "-....-")
,('(', "-.--.-")
,(')', "-.--.-")
,('0', "-----")
,('1', ".----")
,('2', "..---")
,('3', "...--")
,('4', "....-")
,('5', ".....")
,('6', "-....")
,('7', "--...")
,('8', "---..")
,('9', "----.")
,('Ä', ".-.-")
,('Æ', ".-.-")
,('Á', ".--.-")
,('Å', ".--.-")
,('ß', ".../...")
,('É', "..-..")
,('Ñ', "--.--")
,('Ö', "---.")
,('Ø', "---.")
,('Ü', "..--")
,('@', ".--.-.")]
toMorseCode :: String -> String
toMorseCode =
concatMap (\x ->
case findMinMatch morseCode (\ k _ -> k == toLower x) of
Just (_, morse) -> morse
Nothing -> [x])
findMinMatch :: Ord k => Map k a -> (k -> a -> Bool) -> Maybe (k, a)
findMinMatch map fun = match
where filterMap = M.filterWithKey fun map
match = if M.null filterMap
then Nothing
else Just $ M.findMin filterMap