packages feed

ghc-typelits-extra 0.1.2 → 0.1.3

raw patch · 6 files changed

+28/−35 lines, 6 filesdep +integer-gmp

Dependencies added: integer-gmp

Files

CHANGELOG.md view
@@ -1,5 +1,9 @@ # Changelog for the [`ghc-typelits-extra`](http://hackage.haskell.org/package/ghc-typelits-extra) package +## 0.1.3 *July 19th 2016*+* Fixes bugs:+  * Rounding error in `CLog` calculation+ ## 0.1.2 *July 8th 2016* * Solve KnownNat constraints over CLog and GCD, i.e., KnownNat (CLog 2 4) 
README.md view
@@ -8,4 +8,4 @@ as a GHC type-checker plugin:  * `GHC.TypeLits.Extra.GCD`: a type-level `gcd`-* `GHC.TypeLits.Extra.CLog`: type-level equivalent of `clog x y = ceiling (logBase x y)`+* `GHC.TypeLits.Extra.CLog`: type-level equivalent of _the ceiling of_ [integerLogBase#](https://hackage.haskell.org/package/integer-gmp/docs/GHC-Integer-Logarithms.html#v:integerLogBase-35-)
ghc-typelits-extra.cabal view
@@ -1,13 +1,12 @@ name:                ghc-typelits-extra-version:             0.1.2+version:             0.1.3 synopsis:            Additional type-level operations on GHC.TypeLits.Nat description:   Additional type-level operations on @GHC.TypeLits.Nat@:   .   * @GHC.TypeLits.Extra.GCD@: a type-level @gcd@   .-  * @GHC.TypeLits.Extra.CLog@: type-level equivalent of-    \"@clog x y = ceiling (logBase x y)@\"+  * @GHC.TypeLits.Extra.CLog@: type-level equivalent /the ceiling of/ <https://hackage.haskell.org/package/integer-gmp/docs/GHC-Integer-Logarithms.html#v:integerLogBase-35- integerLogBase#>   .   And a custom solver for the above operations defined in   @GHC.TypeLits.Extra.Solver@ as a GHC type-checker plugin. To use the plugin,@@ -49,6 +48,7 @@   build-depends:       base                >= 4.8  && <5,                        ghc                 >= 7.10 && <8.2,                        ghc-tcplugins-extra >= 0.2,+                       integer-gmp         >= 1.0 && <1.1,                        transformers        >= 0.4.2.0 && < 0.6   hs-source-dirs:      src   default-language:    Haskell2010
src/GHC/TypeLits/Extra.hs view
@@ -7,8 +7,7 @@    * 'GCD': a type-level 'gcd' -  * 'CLog': type-level equivalent of-    \"@clog x y = 'ceiling' ('logBase' x y)@\"+  * 'CLog': type-level equivalent of /the ceiling of/ <https://hackage.haskell.org/package/integer-gmp/docs/GHC-Integer-Logarithms.html#v:integerLogBase-35- integerLogBase#>  A custom solver for the above operations defined is defined in "GHC.TypeLits.Extra.Solver" as a GHC type-checker plugin. To use the plugin,@@ -39,11 +38,7 @@ type family GCD (x :: Nat) (y :: Nat) :: Nat where   GCD 0 x = x -- Additional equations are provided by the custom solver --- | Type-level equivalent of:------ @--- clog x y = 'ceiling' ('logBase' x y)--- @+-- | Type-level equivalent of /the ceiling of/ <https://hackage.haskell.org/package/integer-gmp/docs/GHC-Integer-Logarithms.html#v:integerLogBase-35- integerLogBase#> -- -- Note that additional equations are provided by the type-checker plugin solver -- "GHC.TypeLits.Extra.Solver".
src/GHC/TypeLits/Extra/Solver.hs view
@@ -63,8 +63,7 @@ -- --   * @GHC.TypeLits.Extra.GCD@: a type-level 'gcd' -----   * @GHC.TypeLits.Extra.CLog@: type-level equivalent of---     \"@clog x y = 'ceiling' ('logBase' x y)@\"+--   * @GHC.TypeLits.Extra.CLog@: type-level equivalent of /the ceiling of/ <https://hackage.haskell.org/package/integer-gmp/docs/GHC-Integer-Logarithms.html#v:integerLogBase-35- integerLogBase#> -- -- To use the plugin, add --
src/GHC/TypeLits/Extra/Solver/Operations.hs view
@@ -4,7 +4,7 @@ Maintainer :  Christiaan Baaij <christiaan.baaij@gmail.com> -} -{-# LANGUAGE CPP, GeneralizedNewtypeDeriving #-}+{-# LANGUAGE CPP, GeneralizedNewtypeDeriving, MagicHash #-} #if __GLASGOW_HASKELL__ < 711 {-# LANGUAGE StandaloneDeriving #-} #endif@@ -15,12 +15,14 @@   , mergeGCD   , mergeCLog   , mergeExp-  , mergeAdd-  , mergeSub-  , mergeMul   ) where +-- external+import GHC.Base               (isTrue#,(==#),(+#))+import GHC.Integer            (smallInteger)+import GHC.Integer.Logarithms (integerLogBase#)+ -- GHC API import Outputable (Outputable (..), (<+>), integer, text) import Type       (Type, TyVar)@@ -61,26 +63,19 @@ mergeCLog :: ExtraOp -> ExtraOp -> Maybe ExtraOp mergeCLog i (Exp j k)   | i == j && (i /= (I 0)) = Just k-mergeCLog (I i) (I j)-  | i > 1 && j > 0 = Just (I (ceiling (logBase (fromInteger i :: Double)-                                      (fromInteger j))))-  | otherwise      = Nothing-mergeCLog x y = Just (CLog x y)+mergeCLog (I i) (I j)      = I <$> clogBase i j+mergeCLog x y              = Just (CLog x y)  mergeExp :: ExtraOp -> ExtraOp -> ExtraOp mergeExp (I i) (I j) = I (i^j) mergeExp x     y     = Exp x y -mergeAdd :: ExtraOp -> ExtraOp -> Maybe ExtraOp-mergeAdd (I i) (I j) = Just (I (i + j))-mergeAdd _     _     = Nothing--mergeSub :: ExtraOp -> ExtraOp -> Maybe ExtraOp-mergeSub (I i) (I j)-  | let s = i - j-  , s >= 0 = Just (I s)-mergeSub _     _     = Nothing--mergeMul :: ExtraOp -> ExtraOp -> Maybe ExtraOp-mergeMul (I i) (I j) = Just (I (i * j))-mergeMul _     _     = Nothing+-- | \x y -> ceiling (logBase x y), x > 1 && y > 0+clogBase :: Integer -> Integer -> Maybe Integer+clogBase x y | x > 1 && y > 0 =+  let z1 = integerLogBase# x y+      z2 = integerLogBase# x (y-1)+  in  if (isTrue# (z1 ==# z2))+         then Just (smallInteger (z1 +# 1#))+         else Just (smallInteger z1)+clogBase _ _ = Nothing