packages feed

multirec 0.7.6 → 0.7.7

raw patch · 4 files changed

+59/−10 lines, 4 filesdep +multirecPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependencies added: multirec

API changes (from Hackage documentation)

- Generics.MultiRec.Base: [C] :: f r ix -> C c f r ix
- Generics.MultiRec.Base: [Tag] :: f r ix -> (f :>: ix) r ix
- Generics.MultiRec.Fold: infixr 5 &
- Generics.MultiRec.FoldAlg: infixr 5 &
- Generics.MultiRec.FoldAlgK: infixr 5 &
- Generics.MultiRec.FoldK: infixr 5 &
- Generics.MultiRec.TEq: [Refl] :: a :=: a
+ Generics.MultiRec.Base: C :: f r ix -> C c f r ix
+ Generics.MultiRec.Base: Tag :: f r ix -> (f :>: ix) r ix
+ Generics.MultiRec.TEq: Refl :: a :=: a
- Generics.MultiRec.ConNames: conNames :: forall phi ix. (ConNames (PF phi)) => phi ix -> [String]
+ Generics.MultiRec.ConNames: conNames :: (ConNames (PF phi)) => phi ix -> [String]
- Generics.MultiRec.FoldAlg: fold :: forall phi ix r. (Fam phi, HFunctor phi (PF phi), Fold (PF phi)) => Algebra phi r -> phi ix -> ix -> r ix
+ Generics.MultiRec.FoldAlg: fold :: (Fam phi, HFunctor phi (PF phi), Fold (PF phi)) => Algebra phi r -> phi ix -> ix -> r ix
- Generics.MultiRec.FoldAlgK: fold :: forall phi ix r. (Fam phi, HFunctor phi (PF phi), Fold (PF phi)) => Algebra phi r -> phi ix -> ix -> r
+ Generics.MultiRec.FoldAlgK: fold :: (Fam phi, HFunctor phi (PF phi), Fold (PF phi)) => Algebra phi r -> phi ix -> ix -> r
- Generics.MultiRec.Read: hreader :: forall ix. HReadPrec phi f => phi ix -> (forall ix1. phi ix1 -> ReadPrec (I0 ix1)) -> ReadPrec (f I0 ix)
+ Generics.MultiRec.Read: hreader :: HReadPrec phi f => phi ix -> (forall ix1. phi ix1 -> ReadPrec (I0 ix1)) -> ReadPrec (f I0 ix)

Files

examples/ASTExamples.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE FlexibleContexts     #-}+{-# LANGUAGE LiberalTypeSynonyms  #-} {-# LANGUAGE TypeFamilies         #-} {-# LANGUAGE GADTs                #-} 
examples/All.hs view
@@ -1,5 +1,10 @@-module All where+module Main where  import GRose+import VarTypes+import J import SingleExamples import ASTExamples++main :: IO ()+main = return ()
multirec.cabal view
@@ -1,5 +1,5 @@ name:                 multirec-version:              0.7.6+version:              0.7.7 license:              BSD3 license-file:         LICENSE author:               Alexey Rodriguez,@@ -37,7 +37,7 @@   stability:            experimental build-type:           Simple-cabal-version:        >= 1.6+cabal-version:        >= 1.10 tested-with:          GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.3, GHC == 8.0.1 extra-source-files:   examples/All.hs                       examples/AST.hs@@ -80,5 +80,15 @@                       -- Extra                       Generics.MultiRec.TEq +  default-language:   Haskell2010+   build-depends:      base >= 3.0 && < 5,                       template-haskell >= 2.4 && < 2.12++test-suite examples+  type:               exitcode-stdio-1.0+  main-is:            All.hs+  hs-source-dirs:     examples+  default-language:   Haskell2010+  build-depends:      base >= 3.0 && < 5,+                      multirec
src/Generics/MultiRec/TH.hs view
@@ -36,6 +36,8 @@ import Language.Haskell.TH hiding (Fixity()) import Control.Applicative import Control.Monad+import Data.Foldable (foldrM)+import Data.Maybe (fromJust)  -- | Given the name of the family index GADT, derive everything. deriveAll :: Name -> Q [Dec]@@ -44,6 +46,8 @@     info <- reify n     -- runIO (print info)     let ps  = init (extractParameters info)+    -- runIO (print $ ps)+    -- runIO (print $ extractConstructorNames ps info)     let nps = map (\ (n, ps) -> (remakeName n, ps)) (extractConstructorNames ps info)     let ns  = map fst nps     -- runIO (print nps)@@ -148,10 +152,13 @@ #endif   where     extractFrom :: Con -> [(Name, [Name])]-    extractFrom (ForallC _ eqs c) = map (\ (n, _) -> (n, concatMap extractEq eqs)) (extractFrom c)+    extractFrom (ForallC _ eqs c) = map (\ (n, ps) -> (n, ps ++ concatMap extractEq eqs)) (extractFrom c)     extractFrom (InfixC _ n _)    = [(n, [])]     extractFrom (RecC n _)        = [(n, [])]     extractFrom (NormalC n [])    = [(n, [])]+#if MIN_VERSION_template_haskell(2,11,0)+    extractFrom (GadtC ns _ t)    = map (\ n -> (n, extractType t)) ns+#endif     extractFrom _                 = []      extractEq :: Pred -> [Name]@@ -168,6 +175,22 @@     extractArgs (VarT n)          = [n]     extractArgs _                 = [] +    extractType :: Type -> [Name]+    extractType (AppT a1 a2) = combine (extractVars a1) (extractVars a2)+      where+        combine :: [Name] -> [Name] -> [Name]+        combine vs1 vs2 =+          let+            table = zip vs1 ps+          in+            map (fromJust . flip lookup table) vs2+    extractType _            = []++    extractVars :: Type -> [Name]+    extractVars (AppT t (VarT v)) = extractVars t ++ [v]+    extractVars (AppT t _)        = extractVars t+    extractVars _                 = []+ extractConstructorNames _  _                           = []  @@ -335,7 +358,9 @@     rename (VarT n)       | Just p <- lookup n ps          = varT p     rename t                           = return t-pfField ns ps t@(AppT f a)             = conT ''(:.:) `appT` return f `appT` pfField ns ps a+pfField ns ps t@(AppT f a)+  | TupleT n : ts <- unApp t           = foldrM (\ s t -> conT ''(:*:) `appT` pfField ns ps s `appT` return t) (ConT ''U) ts+  | otherwise                          = conT ''(:.:) `appT` return f `appT` pfField ns ps a pfField ns ps t@(VarT n)   | Just p <- lookup n ps              = {- runIO (print (ps, n)) >> -} conT ''K `appT` varT p pfField ns ps t                        = conT ''K `appT` return t@@ -440,7 +465,11 @@ fromFieldFun ns t   | ConT n : a <- unApp t, remakeName n `elem` ns                              = [| I . I0 |]-fromFieldFun ns t@(AppT f a) = [| D . fmap $(fromFieldFun ns a) |]+fromFieldFun ns t@(AppT f a)+  | TupleT n : ts <- unApp t = mapM (newName . ("x" ++) . show) [1..n] >>= \ vs ->+                               lam1E (tupP (varP <$> vs)) $+                               foldrM (\ (v, t) x -> conE '(:*:) `appE` (fromFieldFun ns t `appE` varE v) `appE` return x) (ConE 'U) (zip vs ts)+  | otherwise                = [| D . fmap $(fromFieldFun ns a) |] fromFieldFun ns t            = [| K |]  toField :: [Name] -> Int -> Type -> Q Exp@@ -448,12 +477,16 @@  toFieldFun :: [Name] -> Type -> Q Exp toFieldFun ns t@(ConT n)-  | remakeName n `elem` ns = [| unI0 . unI |]+  | remakeName n `elem` ns   = [| unI0 . unI |] toFieldFun ns t   | ConT n : a <- unApp t, remakeName n `elem` ns-                           = [| unI0 . unI |]-toFieldFun ns t@(AppT f a) = [| fmap $(toFieldFun ns a) . unD |]-toFieldFun ns t            = [| unK |]+                             = [| unI0 . unI |]+toFieldFun ns t@(AppT f a)+  | TupleT n : ts <- unApp t = mapM (newName . ("x" ++) . show) [1..n] >>= \ vs ->+                               lam1E (foldr (\ v p -> conP '(:*:) [varP v, p]) (conP 'U []) vs) $+                               tupE (zipWith (\ v t -> toFieldFun ns t `appE` varE v) vs ts)+  | otherwise                = [| fmap $(toFieldFun ns a) . unD |]+toFieldFun ns t              = [| unK |]  field :: Int -> Name field n = mkName $ "f" ++ show n