typesafe-precure-0.4.0.0: src/ACME/PreCure/Index/Lib.hs
module ACME.PreCure.Index.Lib
( loadImportedModules
, isTextbookMod
, loadAnnotations
, deriveToJsonWithoutTypeNamePrefix
)
where
import Data.Aeson.TH
( deriveToJSON
)
import qualified Data.Aeson as Json
import Data.Aeson.Types
( Options(fieldLabelModifier)
)
import Data.Char
( toLower
)
import Data.Data
( Data
)
import Data.List
( isPrefixOf
)
import Language.Haskell.TH
( AnnLookup(AnnLookupModule)
, ModuleInfo(ModuleInfo)
, Name
, Dec
, Q
, reifyAnnotations
, reifyModule
, nameBase
)
import Language.Haskell.TH.Syntax
( Module(Module)
, ModName(ModName)
)
loadImportedModules :: Module -> Q [Module]
loadImportedModules = fmap getImportedModules . reifyModule
isTextbookMod :: Module -> Bool
isTextbookMod = ("ACME.PreCure.Textbook" `isPrefixOf`) . getModName
loadAnnotations :: Data a => Module -> Q [a]
loadAnnotations = reifyAnnotations . AnnLookupModule
getModName :: Module -> String
getModName (Module _ (ModName modName)) = modName
getImportedModules :: ModuleInfo -> [Module]
getImportedModules (ModuleInfo mods) = mods
deriveToJsonWithoutTypeNamePrefix :: Name -> Q [Dec]
deriveToJsonWithoutTypeNamePrefix name =
deriveToJSON Json.defaultOptions { fieldLabelModifier = firstLower . drop (length $ nameBase name) } name
firstLower :: String -> String
firstLower (x:xs) = toLower x : xs
firstLower _ = error "firstLower: Assertion failed: empty string"