forked from GitHub/gf-core
37 lines
1.1 KiB
Haskell
37 lines
1.1 KiB
Haskell
{--
|
|
This module provide a function for indexing a pgf.
|
|
|
|
It reads the pgf and add a global flag, called "index", containing a string
|
|
with concrete names and size in bytes separated by a column.
|
|
ex : "DisambPhrasebookEng:18778 PhrasebookBul:49971 PhrasebookCat:32738..."
|
|
--}
|
|
module GF.Index (addIndex) where
|
|
|
|
import PGF
|
|
import PGF.Data
|
|
import PGF.Binary
|
|
import Data.Binary
|
|
import Data.ByteString.Lazy (readFile,length)
|
|
import qualified Data.Map as Map
|
|
import Data.Map (toAscList)
|
|
import Data.List (intercalate)
|
|
import qualified Data.ByteString.Lazy as BS
|
|
|
|
addIndex :: PGF -> PGF
|
|
addIndex pgf = pgf {gflags = flags}
|
|
where flags = Map.insert (mkCId "index") (LStr $ showIndex index) (gflags pgf)
|
|
index = getIndex pgf
|
|
|
|
|
|
showIndex :: [(String,Int)] -> String
|
|
showIndex = intercalate " " . map f
|
|
where f (name,size) = name ++ ":" ++ show size
|
|
|
|
getsize :: Binary a => a -> Int
|
|
getsize x = let bs = encode x in fromIntegral $ Data.ByteString.Lazy.length bs
|
|
|
|
getIndex :: PGF -> [(String,Int)]
|
|
getIndex pgf = cncindex
|
|
where cncindex = map f $ Data.Map.toAscList $ concretes pgf
|
|
f (cncname,cnc) = (show cncname, getsize cnc)
|