module Text.SortByPinyin ( pinyin_char_map , show_pinyin , compare_chinese_char_by_pinyin , compare_chinese_string_by_pinyin ) where import Air.Env import Prelude () import Air.TH import Air.Extra import qualified Data.Char as Char import qualified Data.Text.Read as Text.Read import qualified Data.Text as Text import qualified Data.ByteString.Char8 as StrictByteString import qualified Data.Map as Map import Text.SortByPinyinData (sort_by_pinyin_data) pinyin_data = sort_by_pinyin_data pinyins = pinyin_data.lines.reject (starts_with "#") pinyin_char_map :: Map.Map Char String pinyin_char_map = pinyins .map (split "\t") .map (take 2) .reject (length > is_not 2) .map (\(x:y:_) -> (x,y)) .map_fst hex_to_char .concatMap (\(x,y) -> case x of Nothing -> [] Just x' -> [(x',y)] ) .to_h hex_to_char :: String -> Maybe Char hex_to_char x = case Text.Read.hexadecimal (Text.pack x) of Left _ -> Nothing Right (int_value,_) -> Just - Char.chr int_value show_pinyin :: Char -> Maybe String show_pinyin x = pinyin_char_map.Map.lookup x compare_chinese_char_by_pinyin :: Char -> Char -> Ordering compare_chinese_char_by_pinyin x y = let x_pinyin = show_pinyin x y_pinyin = show_pinyin y in case x_pinyin of Nothing -> compare x y Just x_pinyin_string -> case y_pinyin of Nothing -> compare x y Just y_pinyin_string -> compare x_pinyin_string y_pinyin_string compare_chinese_string_by_pinyin :: String -> String -> Ordering compare_chinese_string_by_pinyin [] ys = LT compare_chinese_string_by_pinyin xs [] = GT compare_chinese_string_by_pinyin (x:xs) (y:ys) = case compare_chinese_char_by_pinyin x y of EQ -> compare_chinese_string_by_pinyin xs ys LT -> LT GT -> GT