module Language.Haskell.TH.Hide(export) where
import Data.List(partition)
import Language.Haskell.TH
export :: [Name] -> [Dec] -> Q [Dec]
export el = buildClause el . partition whereable where
whereable :: Dec -> Bool
whereable d = case d of
(FunD _ _) -> True
(ValD _ _ _) -> True
(SigD _ _) -> True
(PragmaD _) -> True
_ -> False
buildClause el (wh,tl) = do
v <- valD
(splitTup tupP [varP n | n <- el])
(normalB $ splitTup tupE [varE n | n <- el])
(map return wh)
return $ v : tl
splitTup :: ([a] -> a) -> [a] -> a
splitTup tup ls = case splitAt 60 ls of
(_,[]) -> tup ls
(first,rest) -> tup $ first ++ [splitTup tup rest]