packages feed

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