{- } 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