Hello community, here is the log from the commit of package ghc-fclabels for openSUSE:Factory checked in at 2016-02-23 16:57:39 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ghc-fclabels (Old) and /work/SRC/openSUSE:Factory/.ghc-fclabels.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ghc-fclabels" Changes: -------- --- /work/SRC/openSUSE:Factory/ghc-fclabels/ghc-fclabels.changes 2016-01-28 17:24:39.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.ghc-fclabels.new/ghc-fclabels.changes 2016-02-23 16:59:31.000000000 +0100 @@ -1,0 +2,5 @@ +Thu Feb 18 09:12:56 UTC 2016 - mimi...@gmail.com + +- update 2.0.3 + +------------------------------------------------------------------- Old: ---- fclabels-2.0.2.4.tar.gz New: ---- fclabels-2.0.3.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ghc-fclabels.spec ++++++ --- /var/tmp/diff_new_pack.BwZIPW/_old 2016-02-23 16:59:31.000000000 +0100 +++ /var/tmp/diff_new_pack.BwZIPW/_new 2016-02-23 16:59:31.000000000 +0100 @@ -21,7 +21,7 @@ %bcond_without tests Name: ghc-fclabels -Version: 2.0.2.4 +Version: 2.0.3 Release: 0 Summary: First class accessor labels implemented as lenses License: BSD-3-Clause ++++++ fclabels-2.0.2.4.tar.gz -> fclabels-2.0.3.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fclabels-2.0.2.4/CHANGELOG new/fclabels-2.0.3/CHANGELOG --- old/fclabels-2.0.2.4/CHANGELOG 2016-01-18 14:18:19.000000000 +0100 +++ new/fclabels-2.0.3/CHANGELOG 2016-02-17 14:58:34.000000000 +0100 @@ -1,5 +1,9 @@ CHANGELOG +2.0.3 + + - Support GHC 8. + 2.0.2.3 to 2.0.2.4 - Allow transformers 0.5.*. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fclabels-2.0.2.4/README.md new/fclabels-2.0.3/README.md --- old/fclabels-2.0.2.4/README.md 1970-01-01 01:00:00.000000000 +0100 +++ new/fclabels-2.0.3/README.md 2016-02-17 14:58:34.000000000 +0100 @@ -0,0 +1,42 @@ +# fclabels: first class accessor labels + +This package provides first class labels that can act as bidirectional record +fields. The labels can be derived automatically using Template Haskell which +means you don't have to write any boilerplate yourself. The labels are +implemented as _lenses_ and are fully composable. Lenses can be used to _get_, +_set_ and _modify_ parts of a data type in a consistent way. + +See `Data.Label` for an introductory explanation. + +### Total and partial lenses + +Internally lenses do not use Haskell functions directly, but are implemented +as categories. Categories allow the lenses to be run in custom computational +contexts. This approach allows us to make partial lenses that point to fields +of multi-constructor datatypes in an elegant way. + +See `Data.Label.Partial` for the use of partial labels. + +### Monomorphic and polymorphic lenses + +We have both polymorphic and monomorphic lenses. Polymorphic lenses allow +updates that change the type. The types of polymorphic lenses are slightly more +verbose than their monomorphic counterparts, but their usage is similar. +Because monomorphic lenses are built by restricting the types of polymorphic +lenses they are essentially the same and can be freely composed with eachother. + +See `Data.Label.Mono` and `Data.Label.Poly` for the difference between +polymorphic and monomorphic lenses. + +### Using fclabels + +To simplify working with labels we supply both a set of labels for Haskell's +base types, like lists, tuples, Maybe and Either, and we supply a set of +combinators for working with labels for values in the Reader and State monad. + +See `Data.Label.Base` and `Data.Label.Monadic` for more information. + +On Hackage: http://hackage.haskell.org/package/fclabels + +Introduction: http://fvisser.nl/post/2013/okt/1/fclabels-2.0.html + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fclabels-2.0.2.4/bench/Benchmark.hs new/fclabels-2.0.3/bench/Benchmark.hs --- old/fclabels-2.0.2.4/bench/Benchmark.hs 1970-01-01 01:00:00.000000000 +0100 +++ new/fclabels-2.0.3/bench/Benchmark.hs 2016-02-17 14:58:34.000000000 +0100 @@ -0,0 +1,58 @@ +{-# LANGUAGE TemplateHaskell #-} + +import Data.Label +import Prelude hiding ((.), id) +import Control.Category +import Criterion.Main + +data Person = Person + { _name :: String + , _age :: Int + , _place :: Place + , _birthplace :: Maybe Place + } deriving (Show, Eq) + +data Place = Place + { _city + , _country + , _continent :: String + } deriving (Show, Eq) + +mkLabels [''Person, ''Place] + +jan :: Person +jan = Person "Jan" 71 (Place "Utrecht" "The Netherlands" "Europe") Nothing + +getAge :: Int +getAge = get age jan + +moveToAmsterdam :: Person -> Person +moveToAmsterdam = set (city . place) "Amsterdam" + +moveToAmsterdam' :: Person -> Person +moveToAmsterdam' person = person{_place = (_place person){_city = "Amsterdam"}} + +ageByOneYear :: Person -> Person +ageByOneYear = modify age (+1) + +ageByOneYear' :: Person -> Person +ageByOneYear' person = person{_age = (+1) $ _age person} + +moveAndAge :: Person -> Person +moveAndAge = ageByOneYear . moveToAmsterdam . ageByOneYear . ageByOneYear . ageByOneYear + +moveAndAge' :: Person -> Person +moveAndAge' = ageByOneYear' . moveToAmsterdam' . ageByOneYear' . ageByOneYear' . ageByOneYear' + +main :: IO () +main = + defaultMain + [ bench "warmup" $ whnf show "Hello World" + , bench "ageByOneYear" $ whnf ageByOneYear jan + , bench "ageByOneYear'" $ whnf ageByOneYear' jan + , bench "moveToAmsterdam" $ whnf moveToAmsterdam jan + , bench "moveToAmsterdam'" $ whnf moveToAmsterdam' jan + , bench "moveAndAge" $ whnf moveAndAge jan + , bench "moveAndAge'" $ whnf moveAndAge' jan + ] + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fclabels-2.0.2.4/fclabels.cabal new/fclabels-2.0.3/fclabels.cabal --- old/fclabels-2.0.2.4/fclabels.cabal 2016-01-18 14:18:19.000000000 +0100 +++ new/fclabels-2.0.3/fclabels.cabal 2016-02-17 14:58:34.000000000 +0100 @@ -1,5 +1,5 @@ Name: fclabels -Version: 2.0.2.4 +Version: 2.0.3 Author: Sebastiaan Visser, Erik Hesselink, Chris Eidhof, Sjoerd Visscher with lots of help and feedback from others. Synopsis: First class accessor labels implemented as lenses. @@ -47,9 +47,9 @@ See "Data.Label.Base" and "Data.Label.Monadic" for more information. . - * /Changelog from 2.0.2.1 to 2.0.2.2/ + * /Changelog from 2.0.2.4 to 2.0.3/ . - > - Restored support for GHC 7.4. + > - Support GHC 8. Maintainer: Sebastiaan Visser <c...@fvisser.nl> Homepage: https://github.com/sebastiaanvisser/fclabels @@ -59,7 +59,14 @@ Category: Data, Lenses Cabal-Version: >= 1.8 Build-Type: Simple -Extra-Source-Files: CHANGELOG +Tested-With: + GHC==7.6.3, + GHC==7.8.4, + GHC==7.10.3, + GHC==8.0.1 +Extra-Source-Files: + README.md + CHANGELOG Library HS-Source-Dirs: src @@ -78,8 +85,8 @@ GHC-Options: -Wall Build-Depends: - base < 5 - , template-haskell >= 2.2 && < 2.11 + base >= 4.6 && < 4.10 + , template-haskell >= 2.2 && < 2.12 , mtl >= 1.0 && < 2.3 , transformers >= 0.2 && < 0.6 @@ -91,11 +98,21 @@ Type: exitcode-stdio-1.0 HS-Source-Dirs: test Main-Is: TestSuite.hs - Ghc-Options: -Wall -fhpc -threaded + Ghc-Options: -Wall -threaded Build-Depends: base < 5 , fclabels - , template-haskell >= 2.2 && < 2.11 + , template-haskell >= 2.2 && < 2.12 , mtl >= 1.0 && < 2.3 - , transformers >= 0.2 && < 0.5 + , transformers >= 0.2 && < 0.6 , HUnit >= 1.2 && < 1.4 + +Benchmark benchmark + Type: exitcode-stdio-1.0 + HS-Source-Dirs: bench + Main-Is: Benchmark.hs + Ghc-Options: -Wall -threaded + Build-Depends: + base < 5 + , fclabels + , criterion < 1.2 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fclabels-2.0.2.4/src/Data/Label/Derive.hs new/fclabels-2.0.3/src/Data/Label/Derive.hs --- old/fclabels-2.0.2.4/src/Data/Label/Derive.hs 2016-01-18 14:18:19.000000000 +0100 +++ new/fclabels-2.0.3/src/Data/Label/Derive.hs 2016-02-17 14:58:34.000000000 +0100 @@ -202,10 +202,18 @@ delabelize :: Dec -> Dec delabelize dec = case dec of +#if MIN_VERSION_template_haskell(2,11,0) + DataD ctx nm vars mk cs ns -> DataD ctx nm vars mk (con <$> cs) ns + NewtypeD ctx nm vars mk c ns -> NewtypeD ctx nm vars mk (con c) ns +#else DataD ctx nm vars cs ns -> DataD ctx nm vars (con <$> cs) ns NewtypeD ctx nm vars c ns -> NewtypeD ctx nm vars (con c) ns +#endif rest -> rest where con (RecC n vst) = NormalC n (map (\(_, s, t) -> (s, t)) vst) +#if MIN_VERSION_template_haskell(2,11,0) + con (RecGadtC ns vst ty) = GadtC ns (map (\(_, s, t) -> (s, t)) vst) ty +#endif con c = c ------------------------------------------------------------------------------- @@ -272,17 +280,22 @@ -- constructors and the type variables. let (name, cons, vars) = case dec of +#if MIN_VERSION_template_haskell(2,11,0) + DataD _ n vs _ cs _ -> (n, cs, vs) + NewtypeD _ n vs _ c _ -> (n, [c], vs) +#else DataD _ n vs cs _ -> (n, cs, vs) NewtypeD _ n vs c _ -> (n, [c], vs) +#endif _ -> fclError "Can only derive labels for datatypes and newtypes." -- We are only interested in lenses of record constructors. - fields = groupFields mk cons + fields = groupFields mk vars cons forM fields $ generateLabel failing concrete name vars cons -groupFields :: (String -> String) -> [Con] -> [Field ([Context], Subst)] -groupFields mk +groupFields :: (String -> String) -> [TyVarBndr] -> [Con] -> [Field ([Context], Subst)] +groupFields mk vs = map (rename mk) . concatMap (\fs -> let vals = concat (toList <$> fs) cons = fst <$> vals @@ -291,14 +304,14 @@ ) . groupBy eq . sortBy (comparing name) - . concatMap constructorFields + . concatMap (constructorFields vs) where name (Field n _ _ _) = n eq f g = False `fromMaybe` ((==) <$> name f <*> name g) rename f (Field n a b c) = Field (mkName . f . nameBase <$> n) a b c -constructorFields :: Con -> [Field (Context, Subst)] -constructorFields con = +constructorFields :: [TyVarBndr] -> Con -> [Field (Context, Subst)] +constructorFields vs con = case con of @@ -311,14 +324,13 @@ where one (i, f@(n, _, ty)) = Field (Just n) mono ty (Context i c con, []) where fsTys = map (typeVariables . trd) (delete f fs) mono = any (\x -> any (elem x) fsTys) (typeVariables ty) - trd (_, _, x) = x InfixC a c b -> one <$> [(0, a), (1, b)] where one (i, (_, ty)) = Field Nothing mono ty (Context i c con, []) where fsTys = map (typeVariables . snd) [a, b] mono = any (\x -> any (elem x) fsTys) (typeVariables ty) - ForallC x y v -> setEqs <$> constructorFields v + ForallC x y v -> setEqs <$> constructorFields vs v #if MIN_VERSION_template_haskell(2,10,0) where eqs = [ (a, b) | AppT (AppT EqualityT a) b <- y ] #else @@ -326,6 +338,23 @@ #endif setEqs (Field a b c d) = Field a b c (first upd . second (eqs ++) $ d) upd (Context a b c) = Context a b (ForallC x y c) +#if MIN_VERSION_template_haskell(2,11,0) + GadtC cs fs resTy -> concatMap (\c -> one c <$> zip [0..] fs) cs + where one c (i, f@(_, ty)) = Field Nothing mono ty (Context i c con, mkSubst vs resTy) + where fsTys = map (typeVariables . snd) (delete f fs) + mono = any (\x -> any (elem x) fsTys) (typeVariables ty) + RecGadtC cs fs resTy -> concatMap (\c -> one c <$> zip [0..] fs) cs + where one c (i, f@(n, _, ty)) = Field (Just n) mono ty (Context i c con, mkSubst vs resTy) + where fsTys = map (typeVariables . trd) (delete f fs) + mono = any (\x -> any (elem x) fsTys) (typeVariables ty) + +mkSubst :: [TyVarBndr] -> Type -> Subst +mkSubst vars t = go (reverse vars) t + where + go [] _ = [] + go (v:vs) (AppT t1 t2) = (typeFromBinder v, t2) : go vs t1 + go _ _ = fclError "Non-AppT with type variables in mkSubst. Please report this as a bug for fclabels." +#endif prune :: [Context] -> [Con] -> [Con] prune contexts allCons = @@ -338,13 +367,23 @@ unifiableCon a b = and (zipWith unifiable (indices a) (indices b)) where indices con = case con of - NormalC {} -> [] - RecC {} -> [] - InfixC {} -> [] -#if MIN_VERSION_template_haskell(2,10,0) - ForallC _ x _ -> [ c | AppT (AppT EqualityT _) c <- x ] + NormalC {} -> [] + RecC {} -> [] + InfixC {} -> [] +#if MIN_VERSION_template_haskell(2,11,0) + ForallC _ _ ty -> indices ty +#elif MIN_VERSION_template_haskell(2,10,0) + ForallC _ x _ -> [ c | AppT (AppT EqualityT _) c <- x ] #else - ForallC _ x _ -> [ c | EqualP _ c <- x ] + ForallC _ x _ -> [ c | EqualP _ c <- x ] +#endif +#if MIN_VERSION_template_haskell(2,11,0) + GadtC _ _ ty -> conIndices ty + RecGadtC _ _ ty -> conIndices ty + where + conIndices (AppT (ConT _) ty) = [ty] + conIndices (AppT rest ty) = conIndices rest ++ [ty] + conIndices _ = fclError "Non-AppT in conIndices. Please report this as a bug for fclabels." #endif unifiable :: Type -> Type -> Bool @@ -442,21 +481,26 @@ nm = maybe (tupE []) (litE . StringL . nameBase) (guard failing >> mn) wild = if total then [] else [match wildP (normalB [| Left $(nm) |]) []] rght = if total then id else appE [| Right |] - mkCase (Context i _ c) = match pat (normalB (rght var)) [] - where (pat, var) = case1 i c + mkCase (Context i _ c) = map (\(pat, var) -> match pat (normalB (rght var)) []) (case1 i c) lamE [varP pt] - (caseE (varE pt) (map mkCase cons ++ wild)) + (caseE (varE pt) (concatMap mkCase cons ++ wild)) where + case1 :: Int -> Con -> [(Q Pat, Q Exp)] case1 i con = case con of - NormalC c fs -> let s = take (length fs) in (conP c (s pats), var) - RecC c fs -> let s = take (length fs) in (conP c (s pats), var) - InfixC _ c _ -> (infixP (pats !! 0) c (pats !! 1), var) - ForallC _ _ c -> case1 i c + NormalC c fs -> [one fs c] + RecC c fs -> [one fs c] + InfixC _ c _ -> [(infixP (pats !! 0) c (pats !! 1), var)] + ForallC _ _ c -> case1 i c +#if MIN_VERSION_template_haskell(2,11,0) + GadtC cs fs _ -> map (one fs) cs + RecGadtC cs fs _ -> map (one fs) cs +#endif where fresh = mkName <$> delete "f" freshNames pats1 = varP <$> fresh pats = replicate i wildP ++ [pats1 !! i] ++ repeat wildP var = varE (fresh !! i) + one fs c = let s = take (length fs) in (conP c (s pats), var) setter :: Bool -> Bool -> Field ([Context], Subst) -> Q Exp setter failing total (Field mn _ _ (cons, _)) = @@ -465,19 +509,23 @@ nm = maybe (tupE []) (litE . StringL . nameBase) (guard failing >> mn) wild = if total then [] else [match wildP (normalB [| Left $(nm) |]) []] rght = if total then id else appE [| Right |] - mkCase (Context i _ c) = match pat (normalB (rght var)) [] - where (pat, var) = case1 i c + mkCase (Context i _ c) = map (\(pat, var) -> match pat (normalB (rght var)) []) (case1 i c) lamE [tupP [varP md, varP pt]] - (caseE (varE pt) (map mkCase cons ++ wild)) + (caseE (varE pt) (concatMap mkCase cons ++ wild)) where case1 i con = case con of - NormalC c fs -> let s = take (length fs) in (conP c (s pats), apps (conE c) (s vars)) - RecC c fs -> let s = take (length fs) in (conP c (s pats), apps (conE c) (s vars)) - InfixC _ c _ -> ( infixP (pats !! 0) c (pats !! 1) - , infixE (Just (vars !! 0)) (conE c) (Just (vars !! 1)) - ) - ForallC _ _ c -> case1 i c + NormalC c fs -> [one fs c] + RecC c fs -> [one fs c] + InfixC _ c _ -> [( infixP (pats !! 0) c (pats !! 1) + , infixE (Just (vars !! 0)) (conE c) (Just (vars !! 1)) + ) + ] + ForallC _ _ c -> case1 i c +#if MIN_VERSION_template_haskell(2,11,0) + GadtC cs fs _ -> map (one fs) cs + RecGadtC cs fs _ -> map (one fs) cs +#endif where fresh = mkName <$> delete "f" (delete "v" freshNames) pats1 = varP <$> fresh pats = take i pats1 ++ [wildP] ++ drop (i + 1) pats1 @@ -485,6 +533,7 @@ v = varE (mkName "v") vars = take i vars1 ++ [v] ++ drop (i + 1) vars1 apps f as = foldl appE f as + one fs c = let s = take (length fs) in (conP c (s pats), apps (conE c) (s vars)) freshNames :: [String] freshNames = map pure ['a'..'z'] ++ map (('a':) . show) [0 :: Integer ..] @@ -630,3 +679,6 @@ = do tysl <- sequence tys return (foldl AppT (ConT cla) tysl) #endif + +trd :: (a, b, c) -> c +trd (_, _, x) = x diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fclabels-2.0.2.4/test/TestSuite.hs new/fclabels-2.0.3/test/TestSuite.hs --- old/fclabels-2.0.2.4/test/TestSuite.hs 2016-01-18 14:18:19.000000000 +0100 +++ new/fclabels-2.0.3/test/TestSuite.hs 2016-02-17 14:58:34.000000000 +0100 @@ -7,13 +7,23 @@ , TemplateHaskell , TypeOperators , RankNTypes - , FlexibleContexts #-} + , FlexibleContexts + , CPP #-} + +-- Needed for the Either String orphan instances. +#if MIN_VERSION_transformers(0,5,0) && MIN_VERSION_base(4,9,0) +{-# OPTIONS_GHC -Wno-orphans -Wno-warnings-deprecations #-} +#endif module Main where import Control.Arrow import Control.Applicative import Control.Category +#if MIN_VERSION_transformers(0,5,0) && MIN_VERSION_base(4,9,0) +import Control.Monad (MonadPlus (..)) +import Control.Monad.Trans.Error (Error (noMsg)) +#endif import Prelude hiding ((.), id) import Test.HUnit import Data.Label @@ -119,6 +129,38 @@ _Ga = lGa; _Gb = lGb; _Gc = lGc; _Gd = lGd; _Ge = lGe; _Gf = lGf; _Gg = lGg; _Gh = lGh; +data Gadt2 a b where + C7, C8 :: { gi :: b, gj :: a } -> Gadt2 a b + +mkLabel ''Gadt2 + +_Gi :: (ArrowApply cat, ArrowChoice cat, ArrowZero cat) => Poly.Lens cat (Gadt2 a b -> Gadt2 a c) (b -> c) +_Gj :: (ArrowApply cat, ArrowChoice cat, ArrowZero cat) => Poly.Lens cat (Gadt2 a b -> Gadt2 c b) (a -> c) + +_Gi = lGi; _Gj = lGj; + +------------------------------------------------------------------------------- + +-- These instance are needed for the `Failing.Lens String` instance, +-- since that needs a `MonadZero` constraint on `Kleisli (Either String)`, +-- which in turn needs a `MonadPlus (Either String)` constraint. +-- These instances used to exist in transformers but were removed in +-- 0.5.0.0 accidentally, and added in 0.5.2.0. We can probably remove +-- this ifdef after GHC 8 rc3 is released, which will include +-- transformers-0.5.2.0. + +#if MIN_VERSION_transformers(0,5,0) && !MIN_VERSION_transformers(0,5,2) && MIN_VERSION_base(4,9,0) +instance (Error e) => Alternative (Either e) where + empty = Left noMsg + Left _ <|> n = n + m <|> _ = m + +instance Error e => MonadPlus (Either e) where + mzero = Left noMsg + Left _ `mplus` n = n + m `mplus` _ = m +#endif + ------------------------------------------------------------------------------- embed_fB :: Record :~> Newtype Bool