reflection 2.1.6 → 2.1.7
raw patch · 11 files changed
+114/−209 lines, 11 filesdep ~containers
Dependency ranges changed: containers
Files
- .hlint.yaml +2/−0
- .travis.yml +0/−177
- CHANGELOG.markdown +5/−0
- README.markdown +1/−1
- examples/Constraints.hs +3/−2
- examples/FromJSON.hs +12/−1
- examples/ReaderLike.hs +2/−0
- examples/reflection-examples.cabal +19/−9
- fast/Data/Reflection.hs +41/−11
- reflection.cabal +16/−6
- tests/ReifyNatSpec.hs +13/−2
+ .hlint.yaml view
@@ -0,0 +1,2 @@+- ignore: {name: Unused LANGUAGE pragma}+- ignore: {name: Avoid lambda}
− .travis.yml
@@ -1,177 +0,0 @@-# This Travis job script has been generated by a script via-#-# haskell-ci '--output=.travis.yml' '--config=cabal.haskell-ci' 'cabal.project'-#-# To regenerate the script (for example after adjusting tested-with) run-#-# haskell-ci regenerate-#-# For more information, see https://github.com/haskell-CI/haskell-ci-#-# version: 0.10-#-version: ~> 1.0-language: c-os: linux-dist: xenial-git:- # whether to recursively clone submodules- submodules: false-notifications:- irc:- channels:- - irc.freenode.org#haskell-lens- skip_join: true- template:- - "\x0313reflection\x03/\x0306%{branch}\x03 \x0314%{commit}\x03 %{build_url} %{message}"-cache:- directories:- - $HOME/.cabal/packages- - $HOME/.cabal/store- - $HOME/.hlint-before_cache:- - rm -fv $CABALHOME/packages/hackage.haskell.org/build-reports.log- # remove files that are regenerated by 'cabal update'- - rm -fv $CABALHOME/packages/hackage.haskell.org/00-index.*- - rm -fv $CABALHOME/packages/hackage.haskell.org/*.json- - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.cache- - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.tar- - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.tar.idx- - rm -rfv $CABALHOME/packages/head.hackage-jobs:- include:- - compiler: ghc-8.10.1- addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-8.10.1","cabal-install-3.2"]}}- os: linux- - compiler: ghc-8.8.3- addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-8.8.3","cabal-install-3.2"]}}- os: linux- - compiler: ghc-8.6.5- addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-8.6.5","cabal-install-3.2"]}}- os: linux- - compiler: ghc-8.4.4- addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-8.4.4","cabal-install-3.2"]}}- os: linux- - compiler: ghc-8.2.2- addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-8.2.2","cabal-install-3.2"]}}- os: linux- - compiler: ghc-8.0.2- addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-8.0.2","cabal-install-3.2"]}}- os: linux- - compiler: ghc-7.10.3- addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-7.10.3","cabal-install-3.2"]}}- os: linux- - compiler: ghc-7.8.4- addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-7.8.4","cabal-install-3.2"]}}- os: linux- - compiler: ghc-7.6.3- addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-7.6.3","cabal-install-3.2"]}}- os: linux- - compiler: ghc-7.4.2- addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-7.4.2","cabal-install-3.2"]}}- os: linux- - compiler: ghc-7.2.2- addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-7.2.2","cabal-install-3.2"]}}- os: linux- - compiler: ghc-7.0.4- addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-7.0.4","cabal-install-3.2"]}}- os: linux- allow_failures:- - compiler: ghc-7.0.4- - compiler: ghc-7.2.2-before_install:- - HC=$(echo "/opt/$CC/bin/ghc" | sed 's/-/\//')- - WITHCOMPILER="-w $HC"- - HADDOCK=$(echo "/opt/$CC/bin/haddock" | sed 's/-/\//')- - HCPKG="$HC-pkg"- - unset CC- - CABAL=/opt/ghc/bin/cabal- - CABALHOME=$HOME/.cabal- - export PATH="$CABALHOME/bin:$PATH"- - TOP=$(pwd)- - "HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\\d+)\\.(\\d+)\\.(\\d+)(\\.(\\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))')"- - echo $HCNUMVER- - CABAL="$CABAL -vnormal+nowrap"- - set -o pipefail- - TEST=--enable-tests- - BENCH=--enable-benchmarks- - HEADHACKAGE=false- - rm -f $CABALHOME/config- - |- echo "verbose: normal +nowrap +markoutput" >> $CABALHOME/config- echo "remote-build-reporting: anonymous" >> $CABALHOME/config- echo "write-ghc-environment-files: always" >> $CABALHOME/config- echo "remote-repo-cache: $CABALHOME/packages" >> $CABALHOME/config- echo "logs-dir: $CABALHOME/logs" >> $CABALHOME/config- echo "world-file: $CABALHOME/world" >> $CABALHOME/config- echo "extra-prog-path: $CABALHOME/bin" >> $CABALHOME/config- echo "symlink-bindir: $CABALHOME/bin" >> $CABALHOME/config- echo "installdir: $CABALHOME/bin" >> $CABALHOME/config- echo "build-summary: $CABALHOME/logs/build.log" >> $CABALHOME/config- echo "store-dir: $CABALHOME/store" >> $CABALHOME/config- echo "install-dirs user" >> $CABALHOME/config- echo " prefix: $CABALHOME" >> $CABALHOME/config- echo "repository hackage.haskell.org" >> $CABALHOME/config- echo " url: http://hackage.haskell.org/" >> $CABALHOME/config-install:- - ${CABAL} --version- - echo "$(${HC} --version) [$(${HC} --print-project-git-commit-id 2> /dev/null || echo '?')]"- - "echo 'jobs: 2' >> $CABALHOME/config"- - |- echo "program-default-options" >> $CABALHOME/config- echo " ghc-options: $GHCJOBS +RTS -M6G -RTS" >> $CABALHOME/config- - cat $CABALHOME/config- - rm -fv cabal.project cabal.project.local cabal.project.freeze- - travis_retry ${CABAL} v2-update -v- # Generate cabal.project- - rm -rf cabal.project cabal.project.local cabal.project.freeze- - touch cabal.project- - |- echo "packages: ." >> cabal.project- if [ $HCNUMVER -ge 71000 ] ; then echo "packages: ./examples" >> cabal.project ; fi- - |- - "for pkg in $($HCPKG list --simple-output); do echo $pkg | sed 's/-[^-]*$//' | (grep -vE -- '^(reflection|reflection-examples)$' || true) | sed 's/^/constraints: /' | sed 's/$/ installed/' >> cabal.project.local; done"- - cat cabal.project || true- - cat cabal.project.local || true- - if [ -f "./configure.ac" ]; then (cd "." && autoreconf -i); fi- - if [ -f "./examples/configure.ac" ]; then (cd "./examples" && autoreconf -i); fi- - ${CABAL} v2-freeze $WITHCOMPILER ${TEST} ${BENCH}- - "cat cabal.project.freeze | sed -E 's/^(constraints: *| *)//' | sed 's/any.//'"- - rm cabal.project.freeze-script:- - DISTDIR=$(mktemp -d /tmp/dist-test.XXXX)- # Packaging...- - ${CABAL} v2-sdist all- # Unpacking...- - mv dist-newstyle/sdist/*.tar.gz ${DISTDIR}/- - cd ${DISTDIR} || false- - find . -maxdepth 1 -type f -name '*.tar.gz' -exec tar -xvf '{}' \;- - find . -maxdepth 1 -type f -name '*.tar.gz' -exec rm '{}' \;- - PKGDIR_reflection="$(find . -maxdepth 1 -type d -regex '.*/reflection-[0-9.]*')"- - PKGDIR_reflection_examples="$(find . -maxdepth 1 -type d -regex '.*/reflection-examples-[0-9.]*')"- # Generate cabal.project- - rm -rf cabal.project cabal.project.local cabal.project.freeze- - touch cabal.project- - |- echo "packages: ${PKGDIR_reflection}" >> cabal.project- if [ $HCNUMVER -ge 71000 ] ; then echo "packages: ${PKGDIR_reflection_examples}" >> cabal.project ; fi- - |- - "for pkg in $($HCPKG list --simple-output); do echo $pkg | sed 's/-[^-]*$//' | (grep -vE -- '^(reflection|reflection-examples)$' || true) | sed 's/^/constraints: /' | sed 's/$/ installed/' >> cabal.project.local; done"- - cat cabal.project || true- - cat cabal.project.local || true- # Building with tests and benchmarks...- # build & run tests, build benchmarks- - ${CABAL} v2-build $WITHCOMPILER ${TEST} ${BENCH} all- # Testing...- - ${CABAL} v2-test $WITHCOMPILER ${TEST} ${BENCH} all- # cabal check...- - (cd ${PKGDIR_reflection} && ${CABAL} -vnormal check)- - if [ $HCNUMVER -ge 71000 ] ; then (cd ${PKGDIR_reflection_examples} && ${CABAL} -vnormal check) ; fi- # haddock...- - ${CABAL} v2-haddock $WITHCOMPILER --with-haddock $HADDOCK ${TEST} ${BENCH} all- # Building without installed constraints for packages in global-db...- - rm -f cabal.project.local- - ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks all--# REGENDATA ("0.10",["--output=.travis.yml","--config=cabal.haskell-ci","cabal.project"])-# EOF
CHANGELOG.markdown view
@@ -1,3 +1,8 @@+# 2.1.7 [2023.02.28]+* When building with `base-4.18` (GHC 9.6) or later, implement `reifyNat` and+ `reifySymbol` using the API provided by `GHC.TypeLits` instead of resorting+ to `unsafeCoerce`.+ # 2.1.6 [2020.05.16] * Fix a bug in which `give` (and possibly `reify`, `reifyNat`, and `reifySymbol`) could be unsoundly inlined by GHC 8.10 or older to produce
README.markdown view
@@ -1,7 +1,7 @@ reflection ========== -[](https://hackage.haskell.org/package/reflection) [](http://travis-ci.org/ekmett/reflection)+[](https://hackage.haskell.org/package/reflection) [](https://github.com/ekmett/reflection/actions?query=workflow%3AHaskell-CI) This package provides an implementation of the ideas presented in [Functional Pearl: Implicit Configurations](http://okmij.org/ftp/Haskell/tr-15-04.pdf) by Oleg Kiselyov and Chung-Chieh Shan. However, the API has been implemented in a much more efficient manner.
examples/Constraints.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE Rank2Types, TypeFamilies, TypeOperators, ConstraintKinds, PolyKinds, FlexibleInstances, MultiParamTypeClasses, ScopedTypeVariables, FlexibleContexts, UndecidableInstances, CPP #-} module Constraints where -import Control.Newtype -- from newtype+import Control.Newtype.Generics -- from newtype-generics import Data.Constraint -- from constraints import Data.Constraint.Unsafe -- from constraints import Data.Proxy -- from tagged@@ -17,7 +17,8 @@ data Def (p :: * -> Constraint) (a :: *) reifiedIns :: Reifies s (Def p a) :- p (Lift p a s) -instance Newtype (Lift p a s) a where+instance Newtype (Lift p a s) where+ type O (Lift p a s) = a pack = Lift unpack = lower
examples/FromJSON.hs view
@@ -11,6 +11,9 @@ {-# LANGUAGE OverloadedStrings #-} import Data.Aeson -- from aeson+#if MIN_VERSION_aeson(2,0,0)+import qualified Data.Aeson.Key as Key+#endif import Data.Aeson.Types (Parser) import Data.Proxy -- from tagged import Data.Reflection -- from reflection@@ -33,7 +36,15 @@ fooParser :: Text -> Object -> Parser Foo fooParser prefix o = do- Foo <$> o .: (prefix <> "field1") <*> o .: (prefix <> "field2")+ Foo <$> o .: (toKey prefix <> "field1") <*> o .: (toKey prefix <> "field2")++#if MIN_VERSION_aeson(2,0,0)+toKey :: Text -> Key.Key+toKey = Key.fromText+#else+toKey :: Text -> Text+toKey = id+#endif -- A wrapper over Foo carrying a phantom type s newtype J a s = J { runJ :: a }
examples/ReaderLike.hs view
@@ -65,4 +65,6 @@ where conf = reflect (Proxy :: Proxy p) abs = undefined signum = undefined+ (-) = undefined+ negate = undefined fromInteger = Datum
examples/reflection-examples.cabal view
@@ -15,13 +15,16 @@ 2004 Oleg Kiselyov and Chung-chieh Shan build-type: Simple cabal-version: >= 1.10-tested-with: GHC == 7.10.3- , GHC == 8.0.2+tested-with: GHC == 8.0.2 , GHC == 8.2.2 , GHC == 8.4.4 , GHC == 8.6.5- , GHC == 8.8.3- , GHC == 8.10.1+ , GHC == 8.8.4+ , GHC == 8.10.7+ , GHC == 9.0.2+ , GHC == 9.2.6+ , GHC == 9.4.4+ , GHC == 9.6.1 flag examples default: True@@ -31,22 +34,27 @@ buildable: False exposed-modules: Constraints Monoid- build-depends: base >= 4.8 && < 5,+ build-depends: base >= 4.9 && < 5, constraints,- newtype,+ newtype-generics >= 0.5.3, reflection, semigroups, tagged hs-source-dirs: . ghc-options: -Wall+ if impl(ghc >= 8.6)+ ghc-options: -Wno-star-is-type default-language: Haskell2010 executable reflection-from-json if !flag(examples) buildable: False main-is: FromJSON.hs- build-depends: aeson,- base >= 4.8 && < 5,+ build-depends:+ -- TODO: Eventually, we should bump the lower version+ -- bounds to >=2 so that we can remove some CPP in FromJSON.+ aeson >= 1 && < 2.2,+ base >= 4.9 && < 5, microlens, microlens-aeson, reflection,@@ -61,10 +69,12 @@ if !flag(examples) buildable: False main-is: ReaderLike.hs- build-depends: base >= 4.8 && < 5,+ build-depends: base >= 4.9 && < 5, reflection, tagged hs-source-dirs: . ghc-options: -Wall -threaded -rtsopts+ if impl(ghc >= 8.6)+ ghc-options: -Wno-star-is-type default-language: Haskell2010
fast/Data/Reflection.hs view
@@ -134,7 +134,7 @@ #if (__GLASGOW_HASKELL__ >= 707) || (defined(MIN_VERSION_template_haskell) && USE_TYPE_LITS) import GHC.TypeLits # if MIN_VERSION_base(4,10,0)-import Numeric.Natural (Natural)+import qualified Numeric.Natural as Numeric (Natural) # elif __GLASGOW_HASKELL__ >= 707 import Control.Exception (ArithException(..), throw) # endif@@ -154,10 +154,14 @@ import Unsafe.Coerce #endif -#ifdef HLINT-{-# ANN module "HLint: ignore Avoid lambda" #-}+#if MIN_VERSION_base(4,7,0)+import Data.Coerce (Coercible, coerce) #endif +#if MIN_VERSION_base(4,18,0)+import qualified GHC.TypeNats as TN+#endif+ -- Due to https://gitlab.haskell.org/ghc/ghc/issues/16893, inlining -- unsafeCoerce too aggressively can cause optimization to become unsound on -- old versions of GHC. As a workaround, we mark unsafeCoerce-using definitions@@ -199,8 +203,6 @@ -- KnownNat -------------------------------------------------------------------------------- -newtype MagicNat r = MagicNat (forall (n :: Nat). KnownNat n => Proxy n -> r)- -- | This upgraded version of 'reify' can be used to generate a 'KnownNat' suitable for use with other APIs. -- -- Attemping to pass a negative 'Integer' as an argument will result in an@@ -208,6 +210,8 @@ -- -- /Available only on GHC 7.8+/ --+-- >>> import GHC.TypeLits+-- -- >>> reifyNat 4 natVal -- 4 --@@ -215,37 +219,58 @@ -- 4 reifyNat :: forall r. Integer -> (forall (n :: Nat). KnownNat n => Proxy n -> r) -> r+# if MIN_VERSION_base(4,18,0)+-- With base-4.18 or later, we can use the API in GHC.TypeNats to define this+-- function directly.+reifyNat n k = TN.withSomeSNat (fromInteger n :: Numeric.Natural) $+ \(sn :: (SNat n)) -> TN.withKnownNat sn $ k (Proxy :: Proxy n)+{-# INLINE reifyNat #-}+# else+-- On older versions of base, we resort to unsafeCoerce. reifyNat n k = unsafeCoerce (MagicNat k :: MagicNat r)-# if MIN_VERSION_base(4,10,0)+# if MIN_VERSION_base(4,10,0) -- Starting with base-4.10, the internal -- representation of KnownNat changed from Integer -- to Natural, so make sure to perform the same -- conversion before unsafeCoercing.- (fromInteger n :: Natural)-# else+ (fromInteger n :: Numeric.Natural)+# else (if n < 0 then throw Underflow else n)-# endif+# endif Proxy {-# INLINE_UNSAFE_COERCE reifyNat #-} +newtype MagicNat r = MagicNat (forall (n :: Nat). KnownNat n => Proxy n -> r)+# endif+ -------------------------------------------------------------------------------- -- KnownSymbol -------------------------------------------------------------------------------- -newtype MagicSymbol r = MagicSymbol (forall (n :: Symbol). KnownSymbol n => Proxy n -> r)- -- | This upgraded version of 'reify' can be used to generate a 'KnownSymbol' suitable for use with other APIs. -- -- /Available only on GHC 7.8+/ --+-- >>> import GHC.TypeLits+-- -- >>> reifySymbol "hello" symbolVal -- "hello" -- -- >>> reifySymbol "hello" reflect -- "hello" reifySymbol :: forall r. String -> (forall (n :: Symbol). KnownSymbol n => Proxy n -> r) -> r+# if MIN_VERSION_base(4,18,0)+-- With base-4.18 or later, we can use the API in GHC.TypeNats to define this+-- function directly.+reifySymbol s k = withSomeSSymbol s $ \(ss :: SSymbol s) -> withKnownSymbol ss (k (Proxy :: Proxy s))+{-# INLINE reifySymbol #-}+# else+-- On older versions of base, we resort to unsafeCoerce. reifySymbol n k = unsafeCoerce (MagicSymbol k :: MagicSymbol r) n Proxy {-# INLINE_UNSAFE_COERCE reifySymbol #-}+# endif++newtype MagicSymbol r = MagicSymbol (forall (n :: Symbol). KnownSymbol n => Proxy n -> r) #endif ------------------------------------------------------------------------------@@ -664,5 +689,10 @@ sequenceBy :: Traversable t => (forall x. x -> f x) -> (forall x y. f (x -> y) -> f x -> f y) -> t (f a) -> f (t a) sequenceBy pur app = reifyApplicative pur app (traverse ReflectedApplicative) +#if MIN_VERSION_base(4,7,0)+(#.) :: Coercible c b => (b -> c) -> (a -> b) -> (a -> c)+(#.) _ = coerce (\x -> x :: b) :: forall a b. Coercible b a => a -> b+#else (#.) :: (b -> c) -> (a -> b) -> a -> c (#.) _ = unsafeCoerce+#endif
reflection.cabal view
@@ -1,5 +1,5 @@ name: reflection-version: 2.1.6+version: 2.1.7 license: BSD3 license-file: LICENSE author: Edward A. Kmett, Elliott Hird, Oleg Kiselyov and Chung-chieh Shan@@ -25,8 +25,12 @@ and Chung-chieh Shan (<http://okmij.org/ftp/Haskell/tr-15-04.pdf original paper>). However, the API has been streamlined to improve performance. .- Austin Seipp's tutorial <https://www.schoolofhaskell.com/user/thoughtpolice/using-reflection Reflecting values to types and back> provides a summary of the+ There are a handful of tutorials on how to use this library:+ .+ * Austin Seipp's tutorial <https://www.schoolofhaskell.com/user/thoughtpolice/using-reflection Reflecting values to types and back> provides a summary of the approach taken by this library, along with more motivating examples.+ .+ * Arnaud Spiwack's tutorial <https://www.tweag.io/posts/2017-12-21-reflection-tutorial.html All about reflection> explains how to use this library. tested-with: GHC == 7.0.4 , GHC == 7.2.2 , GHC == 7.4.2@@ -37,10 +41,15 @@ , GHC == 8.2.2 , GHC == 8.4.4 , GHC == 8.6.5- , GHC == 8.8.3- , GHC == 8.10.1+ , GHC == 8.8.4+ , GHC == 8.10.7+ , GHC == 9.0.2+ , GHC == 9.2.6+ , GHC == 9.4.4+ , GHC == 9.6.1 extra-source-files:+ .hlint.yaml examples/reflection-examples.cabal examples/LICENSE examples/*.hs@@ -48,7 +57,6 @@ README.markdown slow/Data/Reflection.hs fast/Data/Reflection.hs- .travis.yml flag slow description:@@ -70,6 +78,8 @@ library ghc-options: -Wall+ if impl(ghc >= 8.6)+ ghc-options: -Wno-star-is-type if impl(ghc >= 7.2) default-extensions: Trustworthy@@ -83,7 +93,7 @@ if !impl(ghc >= 8.0) build-depends:- semigroups >= 0.11 && < 0.20+ semigroups >= 0.11 && < 0.21 default-language: Haskell98
tests/ReifyNatSpec.hs view
@@ -3,15 +3,19 @@ module ReifyNatSpec where #if __GLASGOW_HASKELL__ >= 708-import Control.Exception (ArithException(..), evaluate) import Data.Reflection import Test.Hspec.QuickCheck-import Test.QuickCheck (Negative(..), NonNegative(..))+import Test.QuickCheck (NonNegative(..)) # if MIN_VERSION_base(4,10,0) import GHC.TypeNats (natVal) import Numeric.Natural (Natural) # endif++# if __GLASGOW_HASKELL__ != 900+import Control.Exception (ArithException(..), evaluate)+import Test.QuickCheck (Negative(..))+# endif #endif import Test.Hspec@@ -25,9 +29,16 @@ describe "reifyNat" $ do prop "reify positive Integers and reflect them back" $ \(NonNegative (i :: Integer)) -> reifyNat i $ \p -> reflect p `shouldBe` i+# if __GLASGOW_HASKELL__ != 900+ -- Inexplicably, this test fails on GHC 9.0 with hspec-2.8.4 or later.+ -- Moreover, I suspect that undefined behavior is involved in some way,+ -- as the output of hspec will occasionally be swallowed entirely. I have+ -- not been able to observe this phenomenon on any other version of GHC,+ -- so I will simply disable this test on 9.0. prop "should throw an Underflow exception on negative inputs" $ \(Negative (i :: Integer)) -> reifyNat i (evaluate . reflect) `shouldThrow` (== Underflow)+# endif # if MIN_VERSION_base(4,10,0) it "should reflect very large Naturals correctly" $ do -- #41 let d42, d2_63, d2_64 :: Natural