RepLib 0.5.1 → 0.5.2
raw patch · 5 files changed
+124/−14 lines, 5 filesdep ~template-haskellPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: template-haskell
API changes (from Hackage documentation)
+ Generics.RepLib.AbstractReps: instance (Rep k0, Rep a0) => Rep (Map k0 a0)
+ Generics.RepLib.AbstractReps: instance (Rep k0, Rep a0) => Rep1 ctx0 (Map k0 a0)
+ Generics.RepLib.AbstractReps: instance Rep a0 => Rep (Set a0)
+ Generics.RepLib.AbstractReps: instance Rep a0 => Rep1 ctx0 (Set a0)
+ Generics.RepLib.AbstractReps: rMap :: (Rep k_alc6, Rep a_alc7) => R (Map k_alc6 a_alc7)
+ Generics.RepLib.AbstractReps: rMap1 :: (Rep k_alc6, Rep a_alc7) => R1 ctx_alcg (Map k_alc6 a_alc7)
+ Generics.RepLib.AbstractReps: rSet :: Rep a_a4BR => R (Set a_a4BR)
+ Generics.RepLib.AbstractReps: rSet1 :: Rep a_a4BR => R1 ctx_alct (Set a_a4BR)
+ Generics.RepLib.Derive: instance Applicative QN
+ Generics.RepLib.Lib: instance (Enumerate a, Enumerate b) => Enumerate (a, b)
+ Generics.RepLib.Lib: instance (Ord a, Enumerate a) => Enumerate (Set a)
+ Generics.RepLib.Lib: instance (Ord a, Generate a) => Generate (Set a)
+ Generics.RepLib.Lib: instance (Ord a, Lreduce b a) => Lreduce b (Set a)
+ Generics.RepLib.Lib: instance (Ord a, Rreduce b a) => Rreduce b (Set a)
+ Generics.RepLib.Lib: instance (Ord a, Shrink a) => Shrink (Set a)
+ Generics.RepLib.Lib: instance (Ord k, Enumerate k, Enumerate a) => Enumerate (Map k a)
+ Generics.RepLib.Lib: instance (Ord k, Generate k, Generate a) => Generate (Map k a)
+ Generics.RepLib.Lib: instance (Ord k, Shrink k, Shrink a) => Shrink (Map k a)
+ Generics.RepLib.Lib: instance (Rep k, GSum a) => GSum (Map k a)
+ Generics.RepLib.Lib: instance (Rep k, Rep a) => Zero (Map k a)
+ Generics.RepLib.Lib: instance Enumerate ()
+ Generics.RepLib.Lib: instance Enumerate Bool
+ Generics.RepLib.Lib: instance Enumerate Char
+ Generics.RepLib.Lib: instance Enumerate Double
+ Generics.RepLib.Lib: instance Enumerate Float
+ Generics.RepLib.Lib: instance Enumerate Int
+ Generics.RepLib.Lib: instance Enumerate Integer
+ Generics.RepLib.Lib: instance Enumerate a => Enumerate [a]
+ Generics.RepLib.Lib: instance Fold (Map k)
+ Generics.RepLib.Lib: instance Fold Set
+ Generics.RepLib.Lib: instance GSum a => GSum (Set a)
+ Generics.RepLib.Lib: instance Rep a => Zero (Set a)
- Generics.RepLib: class EqT f :: (* -> *)
+ Generics.RepLib: class EqT (f :: * -> *)
- Generics.RepLib.Lib: class Rep1 EnumerateD a => Enumerate a
+ Generics.RepLib.Lib: class Rep1 EnumerateD a => Enumerate a where enumerate = enumerateR1 rep1
- Generics.RepLib.Lib: class Rep1 GSumD a => GSum a
+ Generics.RepLib.Lib: class Rep1 GSumD a => GSum a where gsum = gsumR1 rep1
- Generics.RepLib.Lib: class Rep1 GenerateD a => Generate a
+ Generics.RepLib.Lib: class Rep1 GenerateD a => Generate a where generate = generateR1 rep1
- Generics.RepLib.Lib: class Rep1 (LreduceD b) a => Lreduce b a
+ Generics.RepLib.Lib: class Rep1 (LreduceD b) a => Lreduce b a where lreduce = lreduceR1 rep1
- Generics.RepLib.Lib: class Rep1 (RreduceD b) a => Rreduce b a
+ Generics.RepLib.Lib: class Rep1 (RreduceD b) a => Rreduce b a where rreduce = rreduceR1 rep1
- Generics.RepLib.Lib: class Rep1 ShrinkD a => Shrink a
+ Generics.RepLib.Lib: class Rep1 ShrinkD a => Shrink a where shrink a = subtrees a ++ shrinkStep a where shrinkStep _t = let M _ ts = gmapM1 m a in ts m :: forall b. ShrinkD b -> b -> M b m d x = M x (shrinkD d x)
- Generics.RepLib.Lib: class Rep1 ZeroD a => Zero a
+ Generics.RepLib.Lib: class Rep1 ZeroD a => Zero a where zero = zeroR1 rep1
- Generics.RepLib.PreludeReps: rBool1 :: () -> () -> R1 ctx_afuK Bool
+ Generics.RepLib.PreludeReps: rBool1 :: () -> () -> R1 ctx_af4l Bool
- Generics.RepLib.PreludeReps: rEither :: (Rep a_afv4, Rep b_afv3) => R (Either a_afv4 b_afv3)
+ Generics.RepLib.PreludeReps: rEither :: (Rep a_af4E, Rep b_af4F) => R (Either a_af4E b_af4F)
- Generics.RepLib.PreludeReps: rEither1 :: (Rep a_afv4, Rep b_afv3) => ctx_afvd a_afv4 -> ctx_afvd b_afv3 -> R1 ctx_afvd (Either a_afv4 b_afv3)
+ Generics.RepLib.PreludeReps: rEither1 :: (Rep a_af4E, Rep b_af4F) => ctx_af4O a_af4E -> ctx_af4O b_af4F -> R1 ctx_af4O (Either a_af4E b_af4F)
- Generics.RepLib.PreludeReps: rMaybe :: Rep a_a1Ax => R (Maybe a_a1Ax)
+ Generics.RepLib.PreludeReps: rMaybe :: Rep a_a1vn => R (Maybe a_a1vn)
- Generics.RepLib.PreludeReps: rMaybe1 :: Rep a_a1Ax => () -> ctx_afuR a_a1Ax -> R1 ctx_afuR (Maybe a_a1Ax)
+ Generics.RepLib.PreludeReps: rMaybe1 :: Rep a_a1vn => () -> ctx_af4s a_a1vn -> R1 ctx_af4s (Maybe a_a1vn)
- Generics.RepLib.PreludeReps: rOrdering1 :: () -> () -> () -> R1 ctx_afvu Ordering
+ Generics.RepLib.PreludeReps: rOrdering1 :: () -> () -> () -> R1 ctx_af55 Ordering
- Generics.RepLib.PreludeReps: rTup3_1 :: (Rep a_12, Rep b_13, Rep c_14) => (ctx_afvE a_12, ctx_afvE b_13, ctx_afvE c_14) -> R1 ctx_afvE ((,,) a_12 b_13 c_14)
+ Generics.RepLib.PreludeReps: rTup3_1 :: (Rep a_12, Rep b_13, Rep c_14) => (ctx_af5f a_12, ctx_af5f b_13, ctx_af5f c_14) -> R1 ctx_af5f ((,,) a_12 b_13 c_14)
- Generics.RepLib.PreludeReps: rTup4_1 :: (Rep a_12, Rep b_13, Rep c_14, Rep d_15) => (ctx_afvX a_12, ctx_afvX b_13, ctx_afvX c_14, ctx_afvX d_15) -> R1 ctx_afvX ((,,,) a_12 b_13 c_14 d_15)
+ Generics.RepLib.PreludeReps: rTup4_1 :: (Rep a_12, Rep b_13, Rep c_14, Rep d_15) => (ctx_af5y a_12, ctx_af5y b_13, ctx_af5y c_14, ctx_af5y d_15) -> R1 ctx_af5y ((,,,) a_12 b_13 c_14 d_15)
- Generics.RepLib.PreludeReps: rTup5_1 :: (Rep a_12, Rep b_13, Rep c_14, Rep d_15, Rep e_16) => (ctx_afwl a_12, ctx_afwl b_13, ctx_afwl c_14, ctx_afwl d_15, ctx_afwl e_16) -> R1 ctx_afwl ((,,,,) a_12 b_13 c_14 d_15 e_16)
+ Generics.RepLib.PreludeReps: rTup5_1 :: (Rep a_12, Rep b_13, Rep c_14, Rep d_15, Rep e_16) => (ctx_af5W a_12, ctx_af5W b_13, ctx_af5W c_14, ctx_af5W d_15, ctx_af5W e_16) -> R1 ctx_af5W ((,,,,) a_12 b_13 c_14 d_15 e_16)
- Generics.RepLib.PreludeReps: rTup6_1 :: (Rep a_12, Rep b_13, Rep c_14, Rep d_15, Rep e_16, Rep f_17) => (ctx_afwO a_12, ctx_afwO b_13, ctx_afwO c_14, ctx_afwO d_15, ctx_afwO e_16, ctx_afwO f_17) -> R1 ctx_afwO ((,,,,,) a_12 b_13 c_14 d_15 e_16 f_17)
+ Generics.RepLib.PreludeReps: rTup6_1 :: (Rep a_12, Rep b_13, Rep c_14, Rep d_15, Rep e_16, Rep f_17) => (ctx_af6p a_12, ctx_af6p b_13, ctx_af6p c_14, ctx_af6p d_15, ctx_af6p e_16, ctx_af6p f_17) -> R1 ctx_af6p ((,,,,,) a_12 b_13 c_14 d_15 e_16 f_17)
- Generics.RepLib.PreludeReps: rTup7_1 :: (Rep a_12, Rep b_13, Rep c_14, Rep d_15, Rep e_16, Rep f_17, Rep g_18) => (ctx_afxm a_12, ctx_afxm b_13, ctx_afxm c_14, ctx_afxm d_15, ctx_afxm e_16, ctx_afxm f_17, ctx_afxm g_18) -> R1 ctx_afxm ((,,,,,,) a_12 b_13 c_14 d_15 e_16 f_17 g_18)
+ Generics.RepLib.PreludeReps: rTup7_1 :: (Rep a_12, Rep b_13, Rep c_14, Rep d_15, Rep e_16, Rep f_17, Rep g_18) => (ctx_af6X a_12, ctx_af6X b_13, ctx_af6X c_14, ctx_af6X d_15, ctx_af6X e_16, ctx_af6X f_17, ctx_af6X g_18) -> R1 ctx_af6X ((,,,,,,) a_12 b_13 c_14 d_15 e_16 f_17 g_18)
Files
- Generics/RepLib/AbstractReps.hs +28/−0
- Generics/RepLib/Derive.hs +15/−1
- Generics/RepLib/Lib.hs +71/−6
- Generics/RepLib/R1.hs +2/−2
- RepLib.cabal +8/−5
+ Generics/RepLib/AbstractReps.hs view
@@ -0,0 +1,28 @@+{-# LANGUAGE TemplateHaskell, UndecidableInstances, ScopedTypeVariables,+ MultiParamTypeClasses, FlexibleContexts, FlexibleInstances,+ TypeSynonymInstances, GADTs+ #-}+++-----------------------------------------------------------------------------+-- |+-- Module : RepLib.LibADT+-- License : BSD+--+-- Maintainer : sweirich@cis.upenn.edu+-- Stability : experimental+-- Portability : non-portable+--+-- Abstract Reps for Common Abstract Datatypes+--+-----------------------------------------------------------------------------+module Generics.RepLib.AbstractReps where++import Generics.RepLib.R+import Generics.RepLib.Derive+import Language.Haskell.TH++import qualified Data.Map+import qualified Data.Set++$(derive_abstract [''Data.Map.Map, ''Data.Set.Set])
Generics/RepLib/Derive.hs view
@@ -4,6 +4,7 @@ , ScopedTypeVariables , GADTs , GeneralizedNewtypeDeriving+ , CPP #-} {-# OPTIONS_GHC -fno-warn-incomplete-patterns #-} @@ -43,7 +44,7 @@ import Control.Monad (replicateM, zipWithM, liftM, liftM2, when) import Control.Monad.Writer (WriterT, MonadWriter(..), runWriterT, lift) import Control.Arrow ((***), second)-import Control.Applicative ((<$>))+import Control.Applicative ((<$>), Applicative) import Unsafe.Coerce @@ -80,8 +81,13 @@ -- while generating constructor representations. newtype QN a = QN { unQN :: WriterT (S.Set Int) Q a }+#if MIN_VERSION_template_haskell(2,7,0)+ deriving (Applicative, Functor, Monad, MonadWriter (S.Set Int))+#else deriving (Functor, Monad, MonadWriter (S.Set Int))+#endif + liftQN :: Q a -> QN a liftQN = QN . lift @@ -93,9 +99,17 @@ qReport b s = liftQN $ qReport b s qRecover = error "qRecover not implemented for QN" qReify n = liftQN $ qReify n+#if MIN_VERSION_template_haskell(2,7,0)+ qReifyInstances n tys = liftQN $ qReifyInstances n tys+#else qClassInstances n tys = liftQN $ qClassInstances n tys+#endif qLocation = liftQN qLocation qRunIO io = liftQN $ qRunIO io +#if MIN_VERSION_template_haskell(2,7,0)+ qLookupName ns s = liftQN $ qLookupName ns s+ qAddDependentFile fp = liftQN $ qAddDependentFile fp+#endif -- Generate the representation for a data constructor. -- As our representation of data constructors evolves, so must this definition.
Generics/RepLib/Lib.hs view
@@ -43,18 +43,26 @@ import Generics.RepLib.R1 import Generics.RepLib.RepAux import Generics.RepLib.PreludeReps()+import Generics.RepLib.AbstractReps() +import Data.List (inits)++import Data.Set (Set)+import qualified Data.Set as Set+import Data.Map (Map)+import qualified Data.Map as Map+ ------------------- Subtrees -------------------------- -- there is no point in using R1 for subtrees -- From Mark P. Jones, Functional programming with -- overloading and higher-order polymorphism -- Also the same function as "children" from SYB III --- | Produce all children of a datastructure with the same type.--- Note that subtrees is available for all representable types. For those that--- are not recursive datatypes, subtrees will always return the--- empty list. But, these trivial instances are convenient to have--- for the Shrink operation below.+-- | Produce all children of a datastructure with the same type. Note+-- that subtrees is available for all representable types. For those+-- that are not recursive datatypes, subtrees will always return the+-- empty list. But, these trivial instances are convenient to have for+-- the Shrink operation below. subtrees :: forall a. Rep a => a -> [a] subtrees x = [y | Just y <- gmapQ (cast :: Query (Maybe a)) x]@@ -125,6 +133,10 @@ instance (GSum a, GSum b) => GSum (a,b) instance (GSum a) => GSum [a] +instance (Rep k, GSum a) => GSum (Map k a) where+ gsum = gsum . Map.elems+instance GSum a => GSum (Set a) where+ gsum = gsum . Set.elems -------------------- Zero ------------------------------ -- | Create a zero element of a type -- @@@ -164,6 +176,12 @@ instance (Zero a, Zero b) => Zero (a,b) instance Zero a => Zero [a] +instance (Rep k, Rep a) => Zero (Map k a) where+ zero = Map.empty+ +instance (Rep a) => Zero (Set a) where+ zero = Set.empty+ ---------- Generate ------------------------------ data GenerateD a = GenerateD { generateD :: Int -> [a] }@@ -202,6 +220,14 @@ instance (Generate a, Generate b) => Generate (a,b) instance Generate a => Generate [a] +instance (Ord a, Generate a) => Generate (Set a) where+ generate i = map Set.fromList (generate i)++instance (Ord k, Generate k, Generate a) => Generate (Map k a) where+ generate 0 = []+ generate i = map Map.fromList + (inits [ (k, v) | k <- generate (i-1), v <- generate (i-1)])+ ------------ Enumerate ------------------------------- -- note that this is not the same as the Enum class in the standard prelude @@ -222,9 +248,29 @@ enumerateR1 r1 = error ("No way to enumerate type: " ++ show r1) enumerateCons :: [Con EnumerateD a] -> [a]-enumerateCons (Con emb rec:rest) = (map (to emb) (fromTupM enumerateD rec)) ++ (enumerateCons rest)+enumerateCons (Con emb rec:rest) = + (map (to emb) (fromTupM enumerateD rec)) ++ (enumerateCons rest) enumerateCons [] = [] +instance Enumerate Int+instance Enumerate Char+instance Enumerate Integer+instance Enumerate Float+instance Enumerate Double+instance Enumerate Bool++instance Enumerate ()+instance (Enumerate a, Enumerate b) => Enumerate (a,b)++-- doesn't really work for infinite types.+instance Enumerate a => Enumerate [a]++instance (Ord a, Enumerate a) => Enumerate (Set a) where+ enumerate = map Set.fromList enumerate+instance (Ord k, Enumerate k, Enumerate a) => Enumerate (Map k a) where+ enumerate = map Map.fromList + (inits [ (k, v) | k <- enumerate, v <- enumerate])+ ----------------- Shrink (from SYB III) ------------------------------- data ShrinkD a = ShrinkD { shrinkD :: a -> [a] }@@ -257,6 +303,12 @@ instance Shrink () instance (Shrink a, Shrink b) => Shrink (a,b) +instance (Ord a, Shrink a) => Shrink (Set a) where+ shrink x = map Set.fromList (shrink (Set.toList x))+ +instance (Ord k, Shrink k, Shrink a) => Shrink (Map k a) where+ shrink m = map Map.fromList (shrink (Map.toList m))+ ------------ Reduce ------------------------------- data RreduceD b a = RreduceD { rreduceD :: a -> b -> b }@@ -303,6 +355,9 @@ instance (Lreduce c a, Lreduce c b) => Lreduce c (a,b) instance Lreduce c a => Lreduce c[a] +instance (Ord a, Lreduce b a) => Lreduce b (Set a) where+ lreduce b a = (lreduce b (Set.toList a))+ instance Rreduce b Int instance Rreduce b () instance Rreduce b Char@@ -310,6 +365,9 @@ instance (Rreduce c a, Rreduce c b) => Rreduce c (a,b) instance Rreduce c a => Rreduce c[a] +instance (Ord a, Rreduce b a) => Rreduce b (Set a) where+ rreduce a b = (rreduce (Set.toList a) b)+ -------------------- Fold ------------------------------- -- | All of the functions below are defined using instances -- of the following class@@ -369,3 +427,10 @@ foldLeft op = lreduceR1 (rList1 (LreduceD { lreduceD = op }) (LreduceD { lreduceD = foldLeft op })) +instance Fold Set where+ foldRight op x b = foldRight op (Set.toList x) b+ foldLeft op b x = foldLeft op b (Set.toList x)++instance Fold (Map k) where+ foldRight op x b = foldRight op (Map.elems x) b+ foldLeft op b x = foldLeft op b (Map.elems x)
Generics/RepLib/R1.hs view
@@ -1,5 +1,5 @@-{-# LANGUAGE TemplateHaskell- , UndecidableInstances+{-# LANGUAGE + UndecidableInstances , GADTs , ScopedTypeVariables , MultiParamTypeClasses
RepLib.cabal view
@@ -1,10 +1,12 @@ name: RepLib-version: 0.5.1+version: 0.5.2 license: BSD3 license-file: LICENSE build-type: Simple cabal-version: >= 1.6-tested-with: GHC == 7.0.1, GHC == 7.0.3, GHC == 7.0.4, GHC == 7.2.1+tested-with: GHC == 7.0.4,+ GHC == 7.2.1,+ GHC == 7.4.1 author: Stephanie Weirich maintainer: Brent Yorgey <byorgey@cis.upenn.edu> Chris Casinghino <ccasin@cis.upenn.edu>@@ -21,8 +23,8 @@ location: http://replib.googlecode.com/svn/trunk/ Library- build-depends: base >= 4.3 && < 5, - template-haskell >= 2.4 && < 2.7, + build-depends: base >= 4.3 && < 5,+ template-haskell >= 2.4 && < 2.8, mtl >= 2.0 && < 2.1, type-equality >= 0.1.0.2 && < 0.2, containers >= 0.4 && < 0.5@@ -37,5 +39,6 @@ Generics.RepLib.Derive, Generics.RepLib.SYB.Aliases, Generics.RepLib.SYB.Schemes,- Generics.RepLib.Unify+ Generics.RepLib.Unify,+ Generics.RepLib.AbstractReps extensions: GADTs