diff --git a/Data/Encoding/Helper/Template.hs b/Data/Encoding/Helper/Template.hs new file mode 100644 index 0000000..3d9850e --- /dev/null +++ b/Data/Encoding/Helper/Template.hs @@ -0,0 +1,33 @@ +{- This module is used to create arrays from lists in template haskell -} + +module Data.Encoding.Helper.Template where + +import Data.Char +import Data.Word +import Data.Array.IArray (Array,array) +import Language.Haskell.TH + +createCharArray :: [(Integer,Char)] -> Integer -> Integer -> Q Exp +#ifndef __HADDOCK__ +createCharArray lst = createArray (map (\(x,y) -> (x,LitE $ CharL y)) lst) +#endif + +createArray :: [(Integer,Exp)] -> Integer -> Integer -> Q Exp +#ifndef __HADDOCK__ +createArray lst from to = return $ AppE + (AppE + (VarE 'array) + (TupE [LitE $ IntegerL from,LitE $ IntegerL to])) + (ListE [ TupE [LitE $ IntegerL x,y] + | (x,y) <- lst ]) +#endif + +xmlArray :: [(Char,[Word8])] -> Integer -> Integer -> Q Exp +#ifndef __HADDOCK__ +xmlArray lst l u = do + let trans = map (\(ch,bin) -> + (toInteger $ ord ch + ,TupE [LitE $ IntegerL (toInteger $ length bin),TupE $ map (\b -> LitE $ IntegerL (fromIntegral b)) bin ++ replicate (4-length bin) (LitE $ IntegerL 0)] + )) (filter (\(c,_) -> ord c <= fromInteger u && ord c >= fromInteger l) lst) + createArray trans l u +#endif