generic-deriving 1.10.6 → 1.10.7
raw patch · 7 files changed
+362/−358 lines, 7 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- CHANGELOG.md +4/−0
- generic-deriving.cabal +3/−3
- src/Generics/Deriving/TH.hs +2/−2
- src/Generics/Deriving/TH/Post4'9.hs +0/−137
- src/Generics/Deriving/TH/Post4_9.hs +137/−0
- src/Generics/Deriving/TH/Pre4'9.hs +0/−216
- src/Generics/Deriving/TH/Pre4_9.hs +216/−0
CHANGELOG.md view
@@ -1,3 +1,7 @@+# 1.10.7+* Renamed internal modules to avoid using apostrophes (averting this bug:+ https://github.com/haskell/cabal/issues/3631)+ # 1.10.6 * A new `base-4-9` Cabal flag was added to more easily facilitate installing `generic-deriving` with manually installed versions of `template-haskell`.
generic-deriving.cabal view
@@ -1,5 +1,5 @@ name: generic-deriving-version: 1.10.6+version: 1.10.7 synopsis: Generic programming library for generalised deriving. description: @@ -69,10 +69,10 @@ Paths_generic_deriving if flag(base-4-9) build-depends: base >= 4.9 && < 5- other-modules: Generics.Deriving.TH.Post4'9+ other-modules: Generics.Deriving.TH.Post4_9 else build-depends: base >= 4.3 && < 4.9- other-modules: Generics.Deriving.TH.Pre4'9+ other-modules: Generics.Deriving.TH.Pre4_9 build-depends: containers >= 0.1 && < 0.6 , ghc-prim < 1
src/Generics/Deriving/TH.hs view
@@ -91,9 +91,9 @@ import Generics.Deriving.TH.Internal #if MIN_VERSION_base(4,9,0)-import Generics.Deriving.TH.Post4'9+import Generics.Deriving.TH.Post4_9 #else-import Generics.Deriving.TH.Pre4'9+import Generics.Deriving.TH.Pre4_9 #endif import Language.Haskell.TH.Lib
− src/Generics/Deriving/TH/Post4'9.hs
@@ -1,137 +0,0 @@-{- |-Module : Generics.Deriving.TH.Post4'9-Copyright : (c) 2008--2009 Universiteit Utrecht-License : BSD3--Maintainer : generics@haskell.org-Stability : experimental-Portability : non-portable--Template Haskell machinery for the type-literal-based variant of GHC-generics introduced in @base-4.9@.--}--module Generics.Deriving.TH.Post4'9 (- deriveMeta- , deriveData- , deriveConstructors- , deriveSelectors- , mkMetaDataType- , mkMetaConsType- , mkMetaSelType- , SelStrictInfo(..)- , reifySelStrictInfo- ) where--import Data.Maybe (fromMaybe)--import Generics.Deriving.TH.Internal--import Language.Haskell.TH.Lib-import Language.Haskell.TH.Syntax--mkMetaDataType :: DataVariety -> Name -> Bool -> Q Type-mkMetaDataType _ n isNewtype =- promotedT metaDataDataName- `appT` litT (strTyLit (nameBase n))- `appT` litT (strTyLit m)- `appT` litT (strTyLit pkg)- `appT` promoteBool isNewtype- where- m, pkg :: String- m = fromMaybe (error "Cannot fetch module name!") (nameModule n)- pkg = fromMaybe (error "Cannot fetch package name!") (namePackage n)--mkMetaConsType :: DataVariety -> Name -> Name -> Bool -> Bool -> Q Type-mkMetaConsType _ _ n conIsRecord conIsInfix = do- mbFi <- reifyFixity n- promotedT metaConsDataName- `appT` litT (strTyLit (nameBase n))- `appT` fixityIPromotedType mbFi conIsInfix- `appT` promoteBool conIsRecord--promoteBool :: Bool -> Q Type-promoteBool True = promotedT trueDataName-promoteBool False = promotedT falseDataName--fixityIPromotedType :: Maybe Fixity -> Bool -> Q Type-fixityIPromotedType mbFi True =- promotedT infixIDataName- `appT` promoteAssociativity a- `appT` litT (numTyLit (toInteger n))- where- Fixity n a = fromMaybe defaultFixity mbFi-fixityIPromotedType _ False = promotedT prefixIDataName--promoteAssociativity :: FixityDirection -> Q Type-promoteAssociativity InfixL = promotedT leftAssociativeDataName-promoteAssociativity InfixR = promotedT rightAssociativeDataName-promoteAssociativity InfixN = promotedT notAssociativeDataName--mkMetaSelType :: DataVariety -> Name -> Name -> Maybe Name -> SelStrictInfo -> Q Type-mkMetaSelType _ _ _ mbF (SelStrictInfo su ss ds) =- let mbSelNameT = case mbF of- Just f -> promotedT justDataName `appT` litT (strTyLit (nameBase f))- Nothing -> promotedT nothingDataName- in promotedT metaSelDataName- `appT` mbSelNameT- `appT` promoteSourceUnpackedness su- `appT` promoteSourceStrictness ss- `appT` promoteDecidedStrictness ds--data SelStrictInfo = SelStrictInfo SourceUnpackedness SourceStrictness DecidedStrictness--promoteSourceUnpackedness :: SourceUnpackedness -> Q Type-promoteSourceUnpackedness NoSourceUnpackedness = promotedT noSourceUnpackednessDataName-promoteSourceUnpackedness SourceNoUnpack = promotedT sourceNoUnpackDataName-promoteSourceUnpackedness SourceUnpack = promotedT sourceUnpackDataName--promoteSourceStrictness :: SourceStrictness -> Q Type-promoteSourceStrictness NoSourceStrictness = promotedT noSourceStrictnessDataName-promoteSourceStrictness SourceLazy = promotedT sourceLazyDataName-promoteSourceStrictness SourceStrict = promotedT sourceStrictDataName--promoteDecidedStrictness :: DecidedStrictness -> Q Type-promoteDecidedStrictness DecidedLazy = promotedT decidedLazyDataName-promoteDecidedStrictness DecidedStrict = promotedT decidedStrictDataName-promoteDecidedStrictness DecidedUnpack = promotedT decidedUnpackDataName--reifySelStrictInfo :: Name -> [Bang] -> Q [SelStrictInfo]-reifySelStrictInfo conName bangs = do- dcdStrs <- reifyConStrictness conName- let (srcUnpks, srcStrs) = unzip $ map splitBang bangs- return $ zipWith3 SelStrictInfo srcUnpks srcStrs dcdStrs--splitBang :: Bang -> (SourceUnpackedness, SourceStrictness)-splitBang (Bang su ss) = (su, ss)---- | Given the type and the name (as string) for the type to derive,--- generate the 'Data' instance, the 'Constructor' instances, and the 'Selector'--- instances.------ On GHC 7.11 and up, this functionality is no longer used in GHC generics,--- so this function generates no declarations.-deriveMeta :: Name -> Q [Dec]-deriveMeta _ = return []---- | Given a datatype name, derive a datatype and instance of class 'Datatype'.------ On GHC 7.11 and up, this functionality is no longer used in GHC generics,--- so this function generates no declarations.-deriveData :: Name -> Q [Dec]-deriveData _ = return []---- | Given a datatype name, derive datatypes and--- instances of class 'Constructor'.------ On GHC 7.11 and up, this functionality is no longer used in GHC generics,--- so this function generates no declarations.-deriveConstructors :: Name -> Q [Dec]-deriveConstructors _ = return []---- | Given a datatype name, derive datatypes and instances of class 'Selector'.------ On GHC 7.11 and up, this functionality is no longer used in GHC generics,--- so this function generates no declarations.-deriveSelectors :: Name -> Q [Dec]-deriveSelectors _ = return []
+ src/Generics/Deriving/TH/Post4_9.hs view
@@ -0,0 +1,137 @@+{- |+Module : Generics.Deriving.TH.Post4_9+Copyright : (c) 2008--2009 Universiteit Utrecht+License : BSD3++Maintainer : generics@haskell.org+Stability : experimental+Portability : non-portable++Template Haskell machinery for the type-literal-based variant of GHC+generics introduced in @base-4.9@.+-}++module Generics.Deriving.TH.Post4_9 (+ deriveMeta+ , deriveData+ , deriveConstructors+ , deriveSelectors+ , mkMetaDataType+ , mkMetaConsType+ , mkMetaSelType+ , SelStrictInfo(..)+ , reifySelStrictInfo+ ) where++import Data.Maybe (fromMaybe)++import Generics.Deriving.TH.Internal++import Language.Haskell.TH.Lib+import Language.Haskell.TH.Syntax++mkMetaDataType :: DataVariety -> Name -> Bool -> Q Type+mkMetaDataType _ n isNewtype =+ promotedT metaDataDataName+ `appT` litT (strTyLit (nameBase n))+ `appT` litT (strTyLit m)+ `appT` litT (strTyLit pkg)+ `appT` promoteBool isNewtype+ where+ m, pkg :: String+ m = fromMaybe (error "Cannot fetch module name!") (nameModule n)+ pkg = fromMaybe (error "Cannot fetch package name!") (namePackage n)++mkMetaConsType :: DataVariety -> Name -> Name -> Bool -> Bool -> Q Type+mkMetaConsType _ _ n conIsRecord conIsInfix = do+ mbFi <- reifyFixity n+ promotedT metaConsDataName+ `appT` litT (strTyLit (nameBase n))+ `appT` fixityIPromotedType mbFi conIsInfix+ `appT` promoteBool conIsRecord++promoteBool :: Bool -> Q Type+promoteBool True = promotedT trueDataName+promoteBool False = promotedT falseDataName++fixityIPromotedType :: Maybe Fixity -> Bool -> Q Type+fixityIPromotedType mbFi True =+ promotedT infixIDataName+ `appT` promoteAssociativity a+ `appT` litT (numTyLit (toInteger n))+ where+ Fixity n a = fromMaybe defaultFixity mbFi+fixityIPromotedType _ False = promotedT prefixIDataName++promoteAssociativity :: FixityDirection -> Q Type+promoteAssociativity InfixL = promotedT leftAssociativeDataName+promoteAssociativity InfixR = promotedT rightAssociativeDataName+promoteAssociativity InfixN = promotedT notAssociativeDataName++mkMetaSelType :: DataVariety -> Name -> Name -> Maybe Name -> SelStrictInfo -> Q Type+mkMetaSelType _ _ _ mbF (SelStrictInfo su ss ds) =+ let mbSelNameT = case mbF of+ Just f -> promotedT justDataName `appT` litT (strTyLit (nameBase f))+ Nothing -> promotedT nothingDataName+ in promotedT metaSelDataName+ `appT` mbSelNameT+ `appT` promoteSourceUnpackedness su+ `appT` promoteSourceStrictness ss+ `appT` promoteDecidedStrictness ds++data SelStrictInfo = SelStrictInfo SourceUnpackedness SourceStrictness DecidedStrictness++promoteSourceUnpackedness :: SourceUnpackedness -> Q Type+promoteSourceUnpackedness NoSourceUnpackedness = promotedT noSourceUnpackednessDataName+promoteSourceUnpackedness SourceNoUnpack = promotedT sourceNoUnpackDataName+promoteSourceUnpackedness SourceUnpack = promotedT sourceUnpackDataName++promoteSourceStrictness :: SourceStrictness -> Q Type+promoteSourceStrictness NoSourceStrictness = promotedT noSourceStrictnessDataName+promoteSourceStrictness SourceLazy = promotedT sourceLazyDataName+promoteSourceStrictness SourceStrict = promotedT sourceStrictDataName++promoteDecidedStrictness :: DecidedStrictness -> Q Type+promoteDecidedStrictness DecidedLazy = promotedT decidedLazyDataName+promoteDecidedStrictness DecidedStrict = promotedT decidedStrictDataName+promoteDecidedStrictness DecidedUnpack = promotedT decidedUnpackDataName++reifySelStrictInfo :: Name -> [Bang] -> Q [SelStrictInfo]+reifySelStrictInfo conName bangs = do+ dcdStrs <- reifyConStrictness conName+ let (srcUnpks, srcStrs) = unzip $ map splitBang bangs+ return $ zipWith3 SelStrictInfo srcUnpks srcStrs dcdStrs++splitBang :: Bang -> (SourceUnpackedness, SourceStrictness)+splitBang (Bang su ss) = (su, ss)++-- | Given the type and the name (as string) for the type to derive,+-- generate the 'Data' instance, the 'Constructor' instances, and the 'Selector'+-- instances.+--+-- On GHC 7.11 and up, this functionality is no longer used in GHC generics,+-- so this function generates no declarations.+deriveMeta :: Name -> Q [Dec]+deriveMeta _ = return []++-- | Given a datatype name, derive a datatype and instance of class 'Datatype'.+--+-- On GHC 7.11 and up, this functionality is no longer used in GHC generics,+-- so this function generates no declarations.+deriveData :: Name -> Q [Dec]+deriveData _ = return []++-- | Given a datatype name, derive datatypes and+-- instances of class 'Constructor'.+--+-- On GHC 7.11 and up, this functionality is no longer used in GHC generics,+-- so this function generates no declarations.+deriveConstructors :: Name -> Q [Dec]+deriveConstructors _ = return []++-- | Given a datatype name, derive datatypes and instances of class 'Selector'.+--+-- On GHC 7.11 and up, this functionality is no longer used in GHC generics,+-- so this function generates no declarations.+deriveSelectors :: Name -> Q [Dec]+deriveSelectors _ = return []
− src/Generics/Deriving/TH/Pre4'9.hs
@@ -1,216 +0,0 @@-{-# LANGUAGE CPP #-}--{- |-Module : Generics.Deriving.TH.Pre4'9-Copyright : (c) 2008--2009 Universiteit Utrecht-License : BSD3--Maintainer : generics@haskell.org-Stability : experimental-Portability : non-portable--Template Haskell machinery for the proxy datatype variant of GHC generics-used up until @base-4.9@.--}--module Generics.Deriving.TH.Pre4'9 (- deriveMeta- , deriveData- , deriveConstructors- , deriveSelectors- , mkMetaDataType- , mkMetaConsType- , mkMetaSelType- , SelStrictInfo- , reifySelStrictInfo- ) where--import Data.List (intercalate)-import Data.Maybe (fromMaybe)--import Generics.Deriving.TH.Internal--import Language.Haskell.TH.Lib-import Language.Haskell.TH.Syntax---- | Given the type and the name (as string) for the type to derive,--- generate the 'Data' instance, the 'Constructor' instances, and the 'Selector'--- instances.-deriveMeta :: Name -> Q [Dec]-deriveMeta n =- do a <- deriveData n- b <- deriveConstructors n- c <- deriveSelectors n- return (a ++ b ++ c)---- | Given a datatype name, derive a datatype and instance of class 'Datatype'.-deriveData :: Name -> Q [Dec]-deriveData = dataInstance---- | Given a datatype name, derive datatypes and--- instances of class 'Constructor'.-deriveConstructors :: Name -> Q [Dec]-deriveConstructors = constrInstance---- | Given a datatype name, derive datatypes and instances of class 'Selector'.-deriveSelectors :: Name -> Q [Dec]-deriveSelectors = selectInstance--dataInstance :: Name -> Q [Dec]-dataInstance n = do- i <- reifyDataInfo n- case i of- Left _ -> return []- Right (n', isNT, _, _, dv) -> mkInstance n' dv isNT- where- mkInstance n' dv isNT = do- ds <- mkDataData dv n'- is <- mkDataInstance dv n' isNT- return $ [ds,is]--constrInstance :: Name -> Q [Dec]-constrInstance n = do- i <- reifyDataInfo n- case i of- Left _ -> return []- Right (n', _, _, cs, dv) -> mkInstance n' cs dv- where- mkInstance n' cs dv = do- ds <- mapM (mkConstrData dv n') cs- is <- mapM (mkConstrInstance dv n') cs- return $ ds ++ is--selectInstance :: Name -> Q [Dec]-selectInstance n = do- i <- reifyDataInfo n- case i of- Left _ -> return []- Right (n', _, _, cs, dv) -> mkInstance n' cs dv- where- mkInstance n' cs dv = do- ds <- mapM (mkSelectData dv n') cs- is <- mapM (mkSelectInstance dv n') cs- return $ concat (ds ++ is)--mkDataData :: DataVariety -> Name -> Q Dec-mkDataData dv n = dataD (cxt []) (genName dv [n]) []-#if MIN_VERSION_template_haskell(2,11,0)- Nothing [] (cxt [])-#else- [] []-#endif--mkConstrData :: DataVariety -> Name -> Con -> Q Dec-mkConstrData dv dt (NormalC n _) =- dataD (cxt []) (genName dv [dt, n]) []-#if MIN_VERSION_template_haskell(2,11,0)- Nothing [] (cxt [])-#else- [] []-#endif-mkConstrData dv dt (RecC n f) =- mkConstrData dv dt (NormalC n (map shrink f))-mkConstrData dv dt (InfixC t1 n t2) =- mkConstrData dv dt (NormalC n [t1,t2])-mkConstrData _ _ con = gadtError con--mkSelectData :: DataVariety -> Name -> Con -> Q [Dec]-mkSelectData dv dt (RecC n fs) = return (map one fs)- where one (f, _, _) = DataD [] (genName dv [dt, n, f]) []-#if MIN_VERSION_template_haskell(2,11,0)- Nothing-#endif- [] []-mkSelectData _ _ _ = return []--mkDataInstance :: DataVariety -> Name -> Bool -> Q Dec-mkDataInstance dv n isNewtype =- instanceD (cxt []) (appT (conT datatypeTypeName) (mkMetaDataType dv n isNewtype)) $- [ funD datatypeNameValName [clause [wildP] (normalB (stringE (nameBase n))) []]- , funD moduleNameValName [clause [wildP] (normalB (stringE name)) []]- ]-#if MIN_VERSION_base(4,7,0)- ++ if isNewtype- then [funD isNewtypeValName [clause [wildP] (normalB (conE trueDataName)) []]]- else []-#endif- where- name = fromMaybe (error "Cannot fetch module name!") (nameModule n)--liftFixity :: Fixity -> Q Exp-liftFixity (Fixity n a) = conE infixDataName- `appE` liftAssociativity a- `appE` lift n--liftAssociativity :: FixityDirection -> Q Exp-liftAssociativity InfixL = conE leftAssociativeDataName-liftAssociativity InfixR = conE rightAssociativeDataName-liftAssociativity InfixN = conE notAssociativeDataName--mkConstrInstance :: DataVariety -> Name -> Con -> Q Dec-mkConstrInstance dv dt (NormalC n _) = mkConstrInstanceWith dv dt n False False []-mkConstrInstance dv dt (RecC n _) =- mkConstrInstanceWith dv dt n True False- [funD conIsRecordValName [clause [wildP] (normalB (conE trueDataName)) []]]-mkConstrInstance dv dt (InfixC _ n _) = do- i <- reify n-#if MIN_VERSION_template_haskell(2,11,0)- fi <- case i of- DataConI{} -> fromMaybe defaultFixity `fmap` reifyFixity n-#else- let fi = case i of- DataConI _ _ _ f -> f-#endif- _ -> error $ "Not a data constructor name: " ++ show n- mkConstrInstanceWith dv dt n False True- [funD conFixityValName [clause [wildP] (normalB (liftFixity fi)) []]]-mkConstrInstance _ _ con = gadtError con--mkConstrInstanceWith :: DataVariety- -> Name- -> Name- -> Bool- -> Bool- -> [Q Dec]- -> Q Dec-mkConstrInstanceWith dv dt n isRecord isInfix extra =- instanceD- (cxt [])- (appT (conT constructorTypeName) (mkMetaConsType dv dt n isRecord isInfix))- (funD conNameValName [clause [wildP] (normalB (stringE (nameBase n))) []] : extra)--mkSelectInstance :: DataVariety -> Name -> Con -> Q [Dec]-mkSelectInstance dv dt (RecC n fs) = mapM (one . fst3) fs where- one :: Name -> Q Dec- one f =- instanceD (cxt []) (appT (conT selectorTypeName) (mkMetaSelType dv dt n (Just f) ()))- [funD selNameValName [clause [wildP]- (normalB (litE (stringL (nameBase f)))) []]]-mkSelectInstance _ _ _ = return []--genName :: DataVariety -> [Name] -> Name-genName dv ns = mkName- . showsDataVariety dv- . intercalate "_"- . consQualName- $ map (sanitizeName . nameBase) ns- where- consQualName :: [String] -> [String]- consQualName = case ns of- [] -> id- n:_ -> (showNameQual n :)--mkMetaDataType :: DataVariety -> Name -> Bool -> Q Type-mkMetaDataType dv n _ = conT $ genName dv [n]--mkMetaConsType :: DataVariety -> Name -> Name -> Bool -> Bool -> Q Type-mkMetaConsType dv dt n _ _ = conT $ genName dv [dt, n]--mkMetaSelType :: DataVariety -> Name -> Name -> Maybe Name -> SelStrictInfo -> Q Type-mkMetaSelType dv dt n (Just f) () = conT $ genName dv [dt, n, f]-mkMetaSelType _ _ _ Nothing () = conT noSelectorTypeName--type SelStrictInfo = ()--reifySelStrictInfo :: Name -> [Strict] -> Q [SelStrictInfo]-reifySelStrictInfo _ bangs = return (map (const ()) bangs)
+ src/Generics/Deriving/TH/Pre4_9.hs view
@@ -0,0 +1,216 @@+{-# LANGUAGE CPP #-}++{- |+Module : Generics.Deriving.TH.Pre4_9+Copyright : (c) 2008--2009 Universiteit Utrecht+License : BSD3++Maintainer : generics@haskell.org+Stability : experimental+Portability : non-portable++Template Haskell machinery for the proxy datatype variant of GHC generics+used up until @base-4.9@.+-}++module Generics.Deriving.TH.Pre4_9 (+ deriveMeta+ , deriveData+ , deriveConstructors+ , deriveSelectors+ , mkMetaDataType+ , mkMetaConsType+ , mkMetaSelType+ , SelStrictInfo+ , reifySelStrictInfo+ ) where++import Data.List (intercalate)+import Data.Maybe (fromMaybe)++import Generics.Deriving.TH.Internal++import Language.Haskell.TH.Lib+import Language.Haskell.TH.Syntax++-- | Given the type and the name (as string) for the type to derive,+-- generate the 'Data' instance, the 'Constructor' instances, and the 'Selector'+-- instances.+deriveMeta :: Name -> Q [Dec]+deriveMeta n =+ do a <- deriveData n+ b <- deriveConstructors n+ c <- deriveSelectors n+ return (a ++ b ++ c)++-- | Given a datatype name, derive a datatype and instance of class 'Datatype'.+deriveData :: Name -> Q [Dec]+deriveData = dataInstance++-- | Given a datatype name, derive datatypes and+-- instances of class 'Constructor'.+deriveConstructors :: Name -> Q [Dec]+deriveConstructors = constrInstance++-- | Given a datatype name, derive datatypes and instances of class 'Selector'.+deriveSelectors :: Name -> Q [Dec]+deriveSelectors = selectInstance++dataInstance :: Name -> Q [Dec]+dataInstance n = do+ i <- reifyDataInfo n+ case i of+ Left _ -> return []+ Right (n', isNT, _, _, dv) -> mkInstance n' dv isNT+ where+ mkInstance n' dv isNT = do+ ds <- mkDataData dv n'+ is <- mkDataInstance dv n' isNT+ return $ [ds,is]++constrInstance :: Name -> Q [Dec]+constrInstance n = do+ i <- reifyDataInfo n+ case i of+ Left _ -> return []+ Right (n', _, _, cs, dv) -> mkInstance n' cs dv+ where+ mkInstance n' cs dv = do+ ds <- mapM (mkConstrData dv n') cs+ is <- mapM (mkConstrInstance dv n') cs+ return $ ds ++ is++selectInstance :: Name -> Q [Dec]+selectInstance n = do+ i <- reifyDataInfo n+ case i of+ Left _ -> return []+ Right (n', _, _, cs, dv) -> mkInstance n' cs dv+ where+ mkInstance n' cs dv = do+ ds <- mapM (mkSelectData dv n') cs+ is <- mapM (mkSelectInstance dv n') cs+ return $ concat (ds ++ is)++mkDataData :: DataVariety -> Name -> Q Dec+mkDataData dv n = dataD (cxt []) (genName dv [n]) []+#if MIN_VERSION_template_haskell(2,11,0)+ Nothing [] (cxt [])+#else+ [] []+#endif++mkConstrData :: DataVariety -> Name -> Con -> Q Dec+mkConstrData dv dt (NormalC n _) =+ dataD (cxt []) (genName dv [dt, n]) []+#if MIN_VERSION_template_haskell(2,11,0)+ Nothing [] (cxt [])+#else+ [] []+#endif+mkConstrData dv dt (RecC n f) =+ mkConstrData dv dt (NormalC n (map shrink f))+mkConstrData dv dt (InfixC t1 n t2) =+ mkConstrData dv dt (NormalC n [t1,t2])+mkConstrData _ _ con = gadtError con++mkSelectData :: DataVariety -> Name -> Con -> Q [Dec]+mkSelectData dv dt (RecC n fs) = return (map one fs)+ where one (f, _, _) = DataD [] (genName dv [dt, n, f]) []+#if MIN_VERSION_template_haskell(2,11,0)+ Nothing+#endif+ [] []+mkSelectData _ _ _ = return []++mkDataInstance :: DataVariety -> Name -> Bool -> Q Dec+mkDataInstance dv n isNewtype =+ instanceD (cxt []) (appT (conT datatypeTypeName) (mkMetaDataType dv n isNewtype)) $+ [ funD datatypeNameValName [clause [wildP] (normalB (stringE (nameBase n))) []]+ , funD moduleNameValName [clause [wildP] (normalB (stringE name)) []]+ ]+#if MIN_VERSION_base(4,7,0)+ ++ if isNewtype+ then [funD isNewtypeValName [clause [wildP] (normalB (conE trueDataName)) []]]+ else []+#endif+ where+ name = fromMaybe (error "Cannot fetch module name!") (nameModule n)++liftFixity :: Fixity -> Q Exp+liftFixity (Fixity n a) = conE infixDataName+ `appE` liftAssociativity a+ `appE` lift n++liftAssociativity :: FixityDirection -> Q Exp+liftAssociativity InfixL = conE leftAssociativeDataName+liftAssociativity InfixR = conE rightAssociativeDataName+liftAssociativity InfixN = conE notAssociativeDataName++mkConstrInstance :: DataVariety -> Name -> Con -> Q Dec+mkConstrInstance dv dt (NormalC n _) = mkConstrInstanceWith dv dt n False False []+mkConstrInstance dv dt (RecC n _) =+ mkConstrInstanceWith dv dt n True False+ [funD conIsRecordValName [clause [wildP] (normalB (conE trueDataName)) []]]+mkConstrInstance dv dt (InfixC _ n _) = do+ i <- reify n+#if MIN_VERSION_template_haskell(2,11,0)+ fi <- case i of+ DataConI{} -> fromMaybe defaultFixity `fmap` reifyFixity n+#else+ let fi = case i of+ DataConI _ _ _ f -> f+#endif+ _ -> error $ "Not a data constructor name: " ++ show n+ mkConstrInstanceWith dv dt n False True+ [funD conFixityValName [clause [wildP] (normalB (liftFixity fi)) []]]+mkConstrInstance _ _ con = gadtError con++mkConstrInstanceWith :: DataVariety+ -> Name+ -> Name+ -> Bool+ -> Bool+ -> [Q Dec]+ -> Q Dec+mkConstrInstanceWith dv dt n isRecord isInfix extra =+ instanceD+ (cxt [])+ (appT (conT constructorTypeName) (mkMetaConsType dv dt n isRecord isInfix))+ (funD conNameValName [clause [wildP] (normalB (stringE (nameBase n))) []] : extra)++mkSelectInstance :: DataVariety -> Name -> Con -> Q [Dec]+mkSelectInstance dv dt (RecC n fs) = mapM (one . fst3) fs where+ one :: Name -> Q Dec+ one f =+ instanceD (cxt []) (appT (conT selectorTypeName) (mkMetaSelType dv dt n (Just f) ()))+ [funD selNameValName [clause [wildP]+ (normalB (litE (stringL (nameBase f)))) []]]+mkSelectInstance _ _ _ = return []++genName :: DataVariety -> [Name] -> Name+genName dv ns = mkName+ . showsDataVariety dv+ . intercalate "_"+ . consQualName+ $ map (sanitizeName . nameBase) ns+ where+ consQualName :: [String] -> [String]+ consQualName = case ns of+ [] -> id+ n:_ -> (showNameQual n :)++mkMetaDataType :: DataVariety -> Name -> Bool -> Q Type+mkMetaDataType dv n _ = conT $ genName dv [n]++mkMetaConsType :: DataVariety -> Name -> Name -> Bool -> Bool -> Q Type+mkMetaConsType dv dt n _ _ = conT $ genName dv [dt, n]++mkMetaSelType :: DataVariety -> Name -> Name -> Maybe Name -> SelStrictInfo -> Q Type+mkMetaSelType dv dt n (Just f) () = conT $ genName dv [dt, n, f]+mkMetaSelType _ _ _ Nothing () = conT noSelectorTypeName++type SelStrictInfo = ()++reifySelStrictInfo :: Name -> [Strict] -> Q [SelStrictInfo]+reifySelStrictInfo _ bangs = return (map (const ()) bangs)