cedict-0.2.1: Data/Char/CEDICT/Reader/ListRebuild.hs
{- }
Takes the list generated by the parser tools and makes other lists with it.
{ -}
module Data.Char.CEDICT.Reader.ListRebuild where
import Data.List
import Data.Ord
type DictList = [ ( String, [(String, String)] ) ]
type CharCharList = [ (Char, [Char]) ]
majorLists list = ( forLookup, forTradSimp, forSimpTrad )
where
forLookup :: DictList
forLookup = merge . sortBy (comparing fst) $ rePacked
forTradSimp :: CharCharList
forTradSimp = keyOnChar tradSimp
forSimpTrad :: CharCharList
forSimpTrad = keyOnChar $ map flipper tradSimp
where
flipper = uncurry $ flip (,)
keyOnChar = merge . sortBy (comparing fst)
rePacked = rePack list
tradSimp = mappingTradSimp list
rePack = concatMap splitTradSimp
where
splitTradSimp (trad, simp, pins, defs) =
if trad /= simp then
[ (trad, (pins, oned)) , (simp, (pins, oned)) ]
else
[ (trad, (pins, oned)) ]
where
oned = intercalate " / " defs
mappingTradSimp = nub . concatMap pairUp
where
pairUp (trad, simp, _, _ ) = filter different $ zip trad simp
where
different (a, b) = a /= b
merge sortedList = merge' [] sortedList
where
merge' res [] = reverse res
merge' [] ((k, v):vals) = merge' [(k, [v])] vals
merge' ((x, a):tail) vals =
case other of
(k, v):rest -> merge' ((k, [v]):next) rest
[] -> next
where
(same, other) = span ((== x) . fst) vals
next = (x, a ++ matter):tail
matter = map snd same