quadratic-irrational 0.1.1 → 0.1.2
raw patch · 4 files changed
+31/−187 lines, 4 filesdep ~arithmoidep ~basedep ~integer-rootsPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: arithmoi, base, integer-roots, semigroups, tasty-quickcheck
API changes (from Hackage documentation)
Files
- .travis.yml +0/−158
- ChangeLog.md +4/−0
- quadratic-irrational.cabal +12/−13
- src/Numeric/QuadraticIrrational.hs +15/−16
− .travis.yml
@@ -1,158 +0,0 @@-# This Travis job script has been generated by a script via-#-# haskell-ci 'quadratic-irrational.cabal'-#-# For more information, see https://github.com/haskell-CI/haskell-ci-#-# version: 0.9.20200321-#-version: ~> 1.0-language: c-os: linux-dist: xenial-git:- # whether to recursively clone submodules- submodules: false-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.0"]}}- 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.0"]}}- os: linux- - compiler: ghc-8.4.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.4.3","cabal-install-3.0"]}}- 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.0"]}}- 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.0"]}}- os: linux- allow_failures:- - compiler: ghc-8.10.1-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- - if [ $HCNUMVER -ge 81000 ] ; then HEADHACKAGE=true ; fi- - 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- - |- if $HEADHACKAGE; then- echo "allow-newer: $($HCPKG list --simple-output | sed -E 's/([a-zA-Z-]+)-[0-9.]+/*:\1/g')" >> $CABALHOME/config- echo "repository head.hackage.ghc.haskell.org" >> $CABALHOME/config- echo " url: https://ghc.gitlab.haskell.org/head.hackage/" >> $CABALHOME/config- echo " secure: True" >> $CABALHOME/config- echo " root-keys: 7541f32a4ccca4f97aea3b22f5e593ba2c0267546016b992dfadcd2fe944e55d" >> $CABALHOME/config- echo " 26021a13b401500c8eb2761ca95c61f2d625bfef951b939a8124ed12ecf07329" >> $CABALHOME/config- echo " f76d08be13e9a61a377a85e2fb63f4c5435d40f8feb3e12eb05905edb8cdea89" >> $CABALHOME/config- echo " key-threshold: 3" >> $CABALHOME/config- fi-install:- - ${CABAL} --version- - echo "$(${HC} --version) [$(${HC} --print-project-git-commit-id 2> /dev/null || echo '?')]"- - |- 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- - |- - "for pkg in $($HCPKG list --simple-output); do echo $pkg | sed 's/-[^-]*$//' | (grep -vE -- '^(quadratic-irrational)$' || 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- - ${CABAL} v2-freeze $WITHCOMPILER ${TEST} ${BENCH}- - "cat cabal.project.freeze | sed -E 's/^(constraints: *| *)//' | sed 's/any.//'"- - rm cabal.project.freeze- - travis_wait 40 ${CABAL} v2-build $WITHCOMPILER ${TEST} ${BENCH} --dep -j2 all- - travis_wait 40 ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks --dep -j2 all-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_quadratic_irrational="$(find . -maxdepth 1 -type d -regex '.*/quadratic-irrational-[0-9.]*')"- # Generate cabal.project- - rm -rf cabal.project cabal.project.local cabal.project.freeze- - touch cabal.project- - |- echo "packages: ${PKGDIR_quadratic_irrational}" >> cabal.project- - |- - "for pkg in $($HCPKG list --simple-output); do echo $pkg | sed 's/-[^-]*$//' | (grep -vE -- '^(quadratic-irrational)$' || true) | sed 's/^/constraints: /' | sed 's/$/ installed/' >> cabal.project.local; done"- - cat cabal.project || true- - cat cabal.project.local || true- # Building...- # this builds all libraries and executables (without tests/benchmarks)- - ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks all- # 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_quadratic_irrational} && ${CABAL} -vnormal check)- # 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.9.20200321",["quadratic-irrational.cabal"])-# EOF
ChangeLog.md view
@@ -1,3 +1,7 @@+# 0.1.2 (2025-07-15)++* Fix `qiAdd`, `qiSub`, `qiMul`, `qiDiv` when one of the arguments is rational, restoring behaviour of `quadratic-irrational-0.0.6`.+ # 0.1.1 (2020-04-15) * Support `arithmoi-0.11`.
quadratic-irrational.cabal view
@@ -1,6 +1,6 @@ name: quadratic-irrational category: Math, Algorithms, Data-version: 0.1.1+version: 0.1.2 license: MIT license-file: LICENSE author: Johan Kiviniemi <devel@johan.kiviniemi.name>@@ -51,13 +51,12 @@ > 3.5 = [3; 2] > (1+√5)/2 = [1; 1, 1, 1, …] > √2 = [1; 2, 2, 2, …]-tested-with: GHC==8.0.2, GHC==8.2.2, GHC==8.4.3, GHC==8.6.5, GHC==8.8.3, GHC==8.10.1+tested-with: GHC==8.0.2, GHC==8.2.2, GHC==8.4.4, GHC==8.6.5, GHC==8.8.4, GHC==8.10.7, GHC==9.0.2, GHC==9.2.8, GHC==9.4.8, GHC==9.6.7, GHC==9.8.4, GHC==9.10.2, GHC==9.12.2 build-type: Simple cabal-version: >= 1.10 extra-source-files: .gitignore- .travis.yml ChangeLog.md README.md @@ -73,15 +72,15 @@ , Numeric.QuadraticIrrational.Ring hs-source-dirs: src build-depends: base >= 4.9 && < 5- , arithmoi >= 0.9- , containers >= 0.5 && < 0.7- , integer-roots >= 1.0- , transformers >= 0.3 && < 0.6+ , arithmoi >= 0.9 && < 0.14+ , containers >= 0.5 && < 0.9+ , integer-roots >= 1.0 && < 1.1+ , transformers >= 0.3 && < 0.7 if impl(ghc <8.0) build-depends:- semigroups >=0.8+ semigroups >=0.8 && < 0.21 default-language: Haskell2010- ghc-options: -Wall -O2 -funbox-strict-fields+ ghc-options: -Wall -O2 -funbox-strict-fields -Wcompat test-suite tasty-tests type: exitcode-stdio-1.0@@ -89,20 +88,20 @@ other-modules: QuadraticIrrational , CyclicList hs-source-dirs: tests- build-depends: base+ build-depends: base < 5 , quadratic-irrational , numbers >= 3000.0 && < 3000.3 , QuickCheck >= 2.7 && < 3 , tasty >= 0.8- , tasty-quickcheck >= 0.8 && < 0.11+ , tasty-quickcheck >= 0.8 && < 0.12 default-language: Haskell2010- ghc-options: -Wall -O2 -funbox-strict-fields+ ghc-options: -Wall -O2 -funbox-strict-fields -Wcompat test-suite doctests type: exitcode-stdio-1.0 main-is: doctests.hs hs-source-dirs: tests- build-depends: base+ build-depends: base < 5 , directory , doctest >= 0.9 , filepath
src/Numeric/QuadraticIrrational.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE GADTs #-}+{-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE ViewPatterns #-}@@ -505,6 +506,16 @@ qiRecip (QI 0) = Nothing qiRecip (QI q) = Just (QI (recip q)) +qiBinOp :: (forall c. KnownSquareFree c => QuadExt c Rational -> QuadExt c Rational -> QuadExt c Rational) -> QI -> QI -> Maybe QI+qiBinOp f (QI q1) (QI (QuadExt r2 0)) =+ Just (QI (q1 `f` QuadExt r2 0))+qiBinOp f (QI (QuadExt r1 0)) (QI q2) =+ Just (QI (QuadExt r1 0 `f` q2))+qiBinOp f (QI (q1 :: QuadExt c1 Rational)) (QI (q2 :: QuadExt c2 Rational)) =+ case sameSquareFree (Proxy :: Proxy c1) (Proxy :: Proxy c2) of+ Nothing -> Nothing+ Just Refl -> Just (QI (q1 `f` q2))+ -- | Add two 'QI's if the square root terms are the same or zeros. -- -- >>> qi 3 4 5 6 `qiAdd` qi 1 0 5 1@@ -519,10 +530,7 @@ -- >>> qi 0 1 5 1 `qiAdd` qi 0 1 6 1 -- Nothing qiAdd :: QI -> QI -> Maybe QI-qiAdd (QI (q1 :: QuadExt c1 Rational)) (QI (q2 :: QuadExt c2 Rational)) =- case sameSquareFree (Proxy :: Proxy c1) (Proxy :: Proxy c2) of- Nothing -> Nothing- Just Refl -> Just (QI (q1 + q2))+qiAdd = qiBinOp (+) -- | Subtract two 'QI's if the square root terms are the same or zeros. --@@ -538,10 +546,7 @@ -- >>> qi 0 1 5 1 `qiSub` qi 0 1 6 1 -- Nothing qiSub :: QI -> QI -> Maybe QI-qiSub (QI (q1 :: QuadExt c1 Rational)) (QI (q2 :: QuadExt c2 Rational)) =- case sameSquareFree (Proxy :: Proxy c1) (Proxy :: Proxy c2) of- Nothing -> Nothing- Just Refl -> Just (QI (q1 - q2))+qiSub = qiBinOp (-) -- | Multiply two 'QI's if the square root terms are the same or zeros. --@@ -560,10 +565,7 @@ -- >>> qi 0 1 5 1 `qiMul` qi 0 1 6 1 -- Nothing qiMul :: QI -> QI -> Maybe QI-qiMul (QI (q1 :: QuadExt c1 Rational)) (QI (q2 :: QuadExt c2 Rational)) =- case sameSquareFree (Proxy :: Proxy c1) (Proxy :: Proxy c2) of- Nothing -> Nothing- Just Refl -> Just (QI (q1 * q2))+qiMul = qiBinOp (*) -- | Divide two 'QI's if the square root terms are the same or zeros. --@@ -586,10 +588,7 @@ -- Nothing qiDiv :: QI -> QI -> Maybe QI qiDiv _ (QI 0) = Nothing-qiDiv (QI (q1 :: QuadExt c1 Rational)) (QI (q2 :: QuadExt c2 Rational)) =- case sameSquareFree (Proxy :: Proxy c1) (Proxy :: Proxy c2) of- Nothing -> Nothing- Just Refl -> Just (QI (q1 / q2))+qiDiv q1 q2 = qiBinOp (/) q1 q2 -- | Exponentiate a 'QI' to an 'Integer' power. --