1
0
forked from GitHub/gf-core
Files
gf-core/src/compiler/GF/Index.hs
gdetrez d7ae73f1c7 Adding an option to the gf compiler to add an index to pgf files
This is gonna be used by the android library to skip unused part of a
pgf file
2010-12-11 16:36:30 +00:00

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)