Hello community, here is the log from the commit of package ghc-ghc-typelits-extra for openSUSE:Factory checked in at 2017-06-04 01:57:27 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ghc-ghc-typelits-extra (Old) and /work/SRC/openSUSE:Factory/.ghc-ghc-typelits-extra.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ghc-ghc-typelits-extra" Sun Jun 4 01:57:27 2017 rev:3 rq:499699 version:0.2.3 Changes: -------- --- /work/SRC/openSUSE:Factory/ghc-ghc-typelits-extra/ghc-ghc-typelits-extra.changes 2017-05-09 18:00:58.851283691 +0200 +++ /work/SRC/openSUSE:Factory/.ghc-ghc-typelits-extra.new/ghc-ghc-typelits-extra.changes 2017-06-04 01:57:28.324179133 +0200 @@ -1,0 +2,5 @@ +Thu May 18 09:52:28 UTC 2017 - psim...@suse.com + +- Update to version 0.2.3 with cabal2obs. + +------------------------------------------------------------------- Old: ---- ghc-typelits-extra-0.2.2.tar.gz New: ---- ghc-typelits-extra-0.2.3.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ghc-ghc-typelits-extra.spec ++++++ --- /var/tmp/diff_new_pack.tkoCpo/_old 2017-06-04 01:57:28.916095510 +0200 +++ /var/tmp/diff_new_pack.tkoCpo/_new 2017-06-04 01:57:28.916095510 +0200 @@ -19,7 +19,7 @@ %global pkg_name ghc-typelits-extra %bcond_with tests Name: ghc-%{pkg_name} -Version: 0.2.2 +Version: 0.2.3 Release: 0 Summary: Additional type-level operations on GHC.TypeLits.Nat License: BSD-2-Clause ++++++ ghc-typelits-extra-0.2.2.tar.gz -> ghc-typelits-extra-0.2.3.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ghc-typelits-extra-0.2.2/CHANGELOG.md new/ghc-typelits-extra-0.2.3/CHANGELOG.md --- old/ghc-typelits-extra-0.2.2/CHANGELOG.md 2017-01-15 19:02:16.000000000 +0100 +++ new/ghc-typelits-extra-0.2.3/CHANGELOG.md 2017-05-15 10:41:17.000000000 +0200 @@ -1,5 +1,20 @@ # Changelog for the [`ghc-typelits-extra`](http://hackage.haskell.org/package/ghc-typelits-extra) package +# 0.2.3 *May 15th 2017* +* Support GHC 8.2 +* `Max`, `Min`, `GCD`, and `LCM` now have a commutativity property [#9](https://github.com/clash-lang/ghc-typelits-extra/issues/9) +* Reduce `GCD 0 x` to `x` [#9](https://github.com/clash-lang/ghc-typelits-extra/issues/9) +* Reduce `GCD 1 x` to `1` [#9](https://github.com/clash-lang/ghc-typelits-extra/issues/9) +* Reduce `GCD x x` to `x` [#9](https://github.com/clash-lang/ghc-typelits-extra/issues/9) +* Reduce `LCM 0 x` to `0` [#9](https://github.com/clash-lang/ghc-typelits-extra/issues/9) +* Reduce `LCM 1 x` to `x` [#9](https://github.com/clash-lang/ghc-typelits-extra/issues/9) +* Reduce `LCM x x` to `x` [#9](https://github.com/clash-lang/ghc-typelits-extra/issues/9) +* Reduce `Max (0-1) 0` to `0` [#10](https://github.com/clash-lang/ghc-typelits-extra/issues/10) +* Reduce `Min (0-1) 0` to `0 - 1` [#10](https://github.com/clash-lang/ghc-typelits-extra/issues/10) +* Fixes bugs: + * Solver turns LCM into GCD [#8](https://github.com/clash-lang/ghc-typelits-extra/issues/8) + * Solver turns Max into Min + # 0.2.2 *January 15th 2017* * Reduce `Min n (n+1)` to `n` * Reduce `Max n (n+1)` to `n+1` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ghc-typelits-extra-0.2.2/ghc-typelits-extra.cabal new/ghc-typelits-extra-0.2.3/ghc-typelits-extra.cabal --- old/ghc-typelits-extra-0.2.2/ghc-typelits-extra.cabal 2017-01-15 19:02:16.000000000 +0100 +++ new/ghc-typelits-extra-0.2.3/ghc-typelits-extra.cabal 2017-05-02 10:48:53.000000000 +0200 @@ -1,5 +1,5 @@ name: ghc-typelits-extra -version: 0.2.2 +version: 0.2.3 synopsis: Additional type-level operations on GHC.TypeLits.Nat description: Additional type-level operations on @GHC.TypeLits.Nat@: @@ -63,9 +63,10 @@ other-modules: GHC.TypeLits.Extra.Solver.Unify GHC.TypeLits.Extra.Solver.Operations build-depends: base >= 4.8 && <5, - ghc >= 7.10 && <8.2, + ghc >= 7.10 && <8.4, + ghc-prim >= 0.5 && <1.0, ghc-tcplugins-extra >= 0.2, - ghc-typelits-knownnat >= 0.2 && <0.3, + ghc-typelits-knownnat >= 0.2 && <0.4, ghc-typelits-natnormalise >= 0.5 && <0.6, integer-gmp >= 1.0 && <1.1, singletons >= 2.2 && <3, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ghc-typelits-extra-0.2.2/src/GHC/TypeLits/Extra/Solver/Operations.hs new/ghc-typelits-extra-0.2.3/src/GHC/TypeLits/Extra/Solver/Operations.hs --- old/ghc-typelits-extra-0.2.2/src/GHC/TypeLits/Extra/Solver/Operations.hs 2017-01-15 19:02:16.000000000 +0100 +++ new/ghc-typelits-extra-0.2.3/src/GHC/TypeLits/Extra/Solver/Operations.hs 2017-05-12 10:43:50.000000000 +0200 @@ -121,7 +121,7 @@ in case isNatural z of Just True -> x Just False -> y - _ -> Max x y + _ -> Min x y mergeDiv :: ExtraOp -> ExtraOp -> Maybe ExtraOp mergeDiv _ (I 0) = Nothing @@ -157,7 +157,7 @@ mergeLCM :: ExtraOp -> ExtraOp -> ExtraOp mergeLCM (I i) (I j) = I (lcm i j) -mergeLCM x y = GCD x y +mergeLCM x y = LCM x y mergeExp :: ExtraOp -> ExtraOp -> ExtraOp mergeExp (I i) (I j) = I (i^j) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ghc-typelits-extra-0.2.2/src/GHC/TypeLits/Extra/Solver/Unify.hs new/ghc-typelits-extra-0.2.3/src/GHC/TypeLits/Extra/Solver/Unify.hs --- old/ghc-typelits-extra-0.2.2/src/GHC/TypeLits/Extra/Solver/Unify.hs 2017-01-15 19:02:16.000000000 +0100 +++ new/ghc-typelits-extra-0.2.3/src/GHC/TypeLits/Extra/Solver/Unify.hs 2017-05-12 11:31:24.000000000 +0200 @@ -4,6 +4,8 @@ Maintainer : Christiaan Baaij <christiaan.ba...@gmail.com> -} +{-# LANGUAGE CPP #-} + module GHC.TypeLits.Extra.Solver.Unify ( ExtraDefs (..) , UnifyResult (..) @@ -85,15 +87,29 @@ unifyExtra :: Ct -> ExtraOp -> ExtraOp -> TcPluginM UnifyResult unifyExtra ct u v = do tcPluginTrace "unifyExtra" (ppr ct $$ ppr u $$ ppr v) - return (unifyExtra' ct u v) + return (unifyExtra' u v) -unifyExtra' :: Ct -> ExtraOp -> ExtraOp -> UnifyResult -unifyExtra' _ u v - | eqFV u v = if u == v then Win - else if containsConstants u || containsConstants v - then Draw - else Lose - | otherwise = Draw +unifyExtra' :: ExtraOp -> ExtraOp -> UnifyResult +unifyExtra' u v + | eqFV u v + = go u v + | otherwise + = Draw + where + go a b | a == b = Win + -- The following operations commute + go (Max a b) (Max x y) = commuteResult (go a y) (go b x) + go (Min a b) (Min x y) = commuteResult (go a y) (go b x) + go (GCD a b) (GCD x y) = commuteResult (go a y) (go b x) + go (LCM a b) (LCM x y) = commuteResult (go a y) (go b x) + -- If there are operations contained in the type which this solver does + -- not understand, then the result is a Draw + go a b = if containsConstants a || containsConstants b then Draw else Lose + + commuteResult Win Win = Win + commuteResult Lose _ = Lose + commuteResult _ Lose = Lose + commuteResult _ _ = Draw fvOP :: ExtraOp -> UniqSet TyVar fvOP (I _) = emptyUniqSet diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ghc-typelits-extra-0.2.2/src/GHC/TypeLits/Extra.hs new/ghc-typelits-extra-0.2.3/src/GHC/TypeLits/Extra.hs --- old/ghc-typelits-extra-0.2.2/src/GHC/TypeLits/Extra.hs 2017-01-15 19:02:16.000000000 +0100 +++ new/ghc-typelits-extra-0.2.3/src/GHC/TypeLits/Extra.hs 2017-05-12 11:01:08.000000000 +0200 @@ -37,6 +37,7 @@ pragma to the header of your file. -} +{-# LANGUAGE CPP #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} @@ -79,17 +80,31 @@ import Data.Proxy (Proxy (..)) import Data.Singletons.TH (genDefunSymbols) import Data.Type.Bool (If) -import GHC.Base (isTrue#,(==#),(+#)) -import GHC.Integer (smallInteger) +import GHC.Base (Int#,isTrue#,(==#),(+#)) import GHC.Integer.Logarithms (integerLogBase#) +#if MIN_VERSION_ghc(8,2,0) +import qualified GHC.TypeNats as N +import GHC.Natural +import GHC.Prim (int2Word#) import GHC.TypeLits +#else +import GHC.Integer (smallInteger) +import GHC.TypeLits as N +#endif (KnownNat, Nat, type (+), type (-), type (<=), type (<=?), natVal) import GHC.TypeLits.KnownNat (KnownNat2 (..), SNatKn (..), nameToSymbol) +#if MIN_VERSION_ghc(8,2,0) +intToNumber :: Int# -> Natural +intToNumber x = NatS# (int2Word# x) +#else +intToNumber :: Int# -> Integer +intToNumber x = smallInteger x +#endif +{-# INLINE intToNumber #-} + -- | Type-level 'max' type family Max (x :: Nat) (y :: Nat) :: Nat where - Max 0 y = y - Max x 0 = x Max n n = n Max x y = If (x <=? y) y x @@ -97,12 +112,10 @@ instance (KnownNat x, KnownNat y) => KnownNat2 $(nameToSymbol ''Max) x y where type KnownNatF2 $(nameToSymbol ''Max) = MaxSym0 - natSing2 = SNatKn (max (natVal (Proxy @x)) (natVal (Proxy @y))) + natSing2 = SNatKn (max (N.natVal (Proxy @x)) (N.natVal (Proxy @y))) -- | Type-level 'min' type family Min (x :: Nat) (y :: Nat) :: Nat where - Min 0 y = 0 - Min x 0 = 0 Min n n = n Min x y = If (x <=? y) x y @@ -110,7 +123,7 @@ instance (KnownNat x, KnownNat y) => KnownNat2 $(nameToSymbol ''Min) x y where type KnownNatF2 $(nameToSymbol ''Min) = MinSym0 - natSing2 = SNatKn (min (natVal (Proxy @x)) (natVal (Proxy @y))) + natSing2 = SNatKn (min (N.natVal (Proxy @x)) (N.natVal (Proxy @y))) -- | Type-level 'div' -- @@ -126,7 +139,7 @@ instance (KnownNat x, KnownNat y, 1 <= y) => KnownNat2 $(nameToSymbol ''Div) x y where type KnownNatF2 $(nameToSymbol ''Div) = DivSym0 - natSing2 = SNatKn (quot (natVal (Proxy @x)) (natVal (Proxy @y))) + natSing2 = SNatKn (quot (N.natVal (Proxy @x)) (N.natVal (Proxy @y))) -- | Type-level 'mod' -- @@ -139,7 +152,7 @@ instance (KnownNat x, KnownNat y, 1 <= y) => KnownNat2 $(nameToSymbol ''Mod) x y where type KnownNatF2 $(nameToSymbol ''Mod) = ModSym0 - natSing2 = SNatKn (rem (natVal (Proxy @x)) (natVal (Proxy @y))) + natSing2 = SNatKn (rem (N.natVal (Proxy @x)) (N.natVal (Proxy @y))) -- | Type-level `divMod` type DivMod n d = '(Div n d, Mod n d) @@ -156,7 +169,11 @@ instance (KnownNat x, KnownNat y, 2 <= x, 1 <= y) => KnownNat2 $(nameToSymbol ''FLog) x y where type KnownNatF2 $(nameToSymbol ''FLog) = FLogSym0 - natSing2 = SNatKn (smallInteger (integerLogBase# (natVal (Proxy @x)) (natVal (Proxy @y)))) +#if MIN_VERSION_ghc (8,2,0) + natSing2 = SNatKn (intToNumber (integerLogBase# (natVal (Proxy @x)) (natVal (Proxy @y)))) +#else + natSing2 = SNatKn (intToNumber (integerLogBase# (natVal (Proxy @x)) (natVal (Proxy @y)))) +#endif -- | Type-level equivalent of /the ceiling of/ <https://hackage.haskell.org/package/integer-gmp/docs/GHC-Integer-Logarithms.html#v:integerLogBase-35- integerLogBase#> -- .i.e. the exact integer equivalent to "@'ceiling' ('logBase' x y)@" @@ -176,8 +193,8 @@ z2 = integerLogBase# x (y-1) in case y of 1 -> SNatKn 0 - _ | isTrue# (z1 ==# z2) -> SNatKn (smallInteger (z1 +# 1#)) - | otherwise -> SNatKn (smallInteger z1) + _ | isTrue# (z1 ==# z2) -> SNatKn (intToNumber (z1 +# 1#)) + | otherwise -> SNatKn (intToNumber z1) -- | Type-level equivalent of <https://hackage.haskell.org/package/integer-gmp/docs/GHC-Integer-Logarithms.html#v:integerLogBase-35- integerLogBase#> -- where the operation only reduces when: @@ -199,30 +216,40 @@ instance (KnownNat x, KnownNat y, FLog x y ~ CLog x y) => KnownNat2 $(nameToSymbol ''Log) x y where type KnownNatF2 $(nameToSymbol ''Log) = LogSym0 - natSing2 = SNatKn (smallInteger (integerLogBase# (natVal (Proxy @x)) (natVal (Proxy @y)))) + natSing2 = SNatKn (intToNumber (integerLogBase# (natVal (Proxy @x)) (natVal (Proxy @y)))) -- | Type-level greatest common denominator (GCD). -- -- Note that additional equations are provided by the type-checker plugin solver -- "GHC.TypeLits.Extra.Solver". type family GCD (x :: Nat) (y :: Nat) :: Nat where - GCD 0 x = x -- Additional equations are provided by the custom solver + GCD 0 x = x + GCD x 0 = x + GCD 1 x = 1 + GCD x 1 = 1 + GCD x x = x + -- Additional equations are provided by the custom solver genDefunSymbols [''GCD] instance (KnownNat x, KnownNat y) => KnownNat2 $(nameToSymbol ''GCD) x y where type KnownNatF2 $(nameToSymbol ''GCD) = GCDSym0 - natSing2 = SNatKn (gcd (natVal (Proxy @x)) (natVal (Proxy @y))) + natSing2 = SNatKn (gcd (N.natVal (Proxy @x)) (N.natVal (Proxy @y))) -- | Type-level least common multiple (LCM). -- -- Note that additional equations are provided by the type-checker plugin solver -- "GHC.TypeLits.Extra.Solver". type family LCM (x :: Nat) (y :: Nat) :: Nat where - LCM 0 x = 0 -- Additional equations are provided by the custom solver + LCM 0 x = 0 + LCM x 0 = 0 + LCM 1 x = x + LCM x 1 = x + LCM x x = x + -- Additional equations are provided by the custom solver genDefunSymbols [''LCM] instance (KnownNat x, KnownNat y) => KnownNat2 $(nameToSymbol ''LCM) x y where type KnownNatF2 $(nameToSymbol ''LCM) = LCMSym0 - natSing2 = SNatKn (lcm (natVal (Proxy @x)) (natVal (Proxy @y))) + natSing2 = SNatKn (lcm (N.natVal (Proxy @x)) (N.natVal (Proxy @y))) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ghc-typelits-extra-0.2.2/tests/Main.hs new/ghc-typelits-extra-0.2.3/tests/Main.hs --- old/ghc-typelits-extra-0.2.2/tests/Main.hs 2017-01-15 19:02:16.000000000 +0100 +++ new/ghc-typelits-extra-0.2.3/tests/Main.hs 2017-05-12 11:36:04.000000000 +0200 @@ -127,6 +127,24 @@ test37 :: (1 <= Div l r) => Proxy l -> Proxy r -> () test37 _ _ = () +test38 :: Proxy (Min (0-1) 0) -> Proxy (0-1) +test38 = id + +test39 :: Proxy (Max (0-1) 0) -> Proxy 0 +test39 = id + +test40 :: Proxy x -> Proxy y -> Proxy (Max x y) -> Proxy (Max y x) +test40 _ _ = id + +test41 :: Proxy x -> Proxy y -> Proxy (Min x y) -> Proxy (Min y x) +test41 _ _ = id + +test42 :: Proxy x -> Proxy y -> Proxy (GCD x y) -> Proxy (GCD y x) +test42 _ _ = id + +test43 :: Proxy x -> Proxy y -> Proxy (LCM x y) -> Proxy (LCM y x) +test43 _ _ = id + main :: IO () main = defaultMain tests @@ -244,6 +262,24 @@ , testCase "1 <= Div 18 3" $ show (test37 (Proxy @18) (Proxy @3)) @?= "()" + , testCase "Min (0-1) 0 ~ (0-1)" $ + show (test38 Proxy) @?= + "Proxy" + , testCase "Max (0-1) 0 ~ 0" $ + show (test39 Proxy) @?= + "Proxy" + , testCase "forall x y . Max x y ~ Max y x" $ + show (test40 Proxy Proxy Proxy) @?= + "Proxy" + , testCase "forall x y . Min x y ~ Min y x" $ + show (test41 Proxy Proxy Proxy) @?= + "Proxy" + , testCase "forall x y . GCD x y ~ GCD y x" $ + show (test42 Proxy Proxy Proxy) @?= + "Proxy" + , testCase "forall x y . LCM x y ~ LCM y x" $ + show (test43 Proxy Proxy Proxy) @?= + "Proxy" ] , testGroup "errors" [ testCase "GCD 6 8 /~ 4" $ testFail1 `throws` testFail1Errors