numeric-extras 0.0.3 → 0.1
raw patch · 4 files changed
+176/−12 lines, 4 filesnew-uploader
Files
- .travis.yml +90/−1
- CHANGELOG.markdown +4/−0
- Numeric/Extras.hs +78/−10
- numeric-extras.cabal +4/−1
.travis.yml view
@@ -1,1 +1,90 @@-language: haskell+# This file has been generated -- see https://github.com/hvr/multi-ghc-travis+language: c+sudo: false++cache:+ directories:+ - $HOME/.cabsnap+ - $HOME/.cabal/packages++before_cache:+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/build-reports.log+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/00-index.tar++matrix:+ include:+ - env: CABALVER=1.16 GHCVER=7.0.4+ compiler: ": #GHC 7.0.4"+ addons: {apt: {packages: [cabal-install-1.16,ghc-7.0.4], sources: [hvr-ghc]}}+ - env: CABALVER=1.16 GHCVER=7.2.2+ compiler: ": #GHC 7.2.2"+ addons: {apt: {packages: [cabal-install-1.16,ghc-7.2.2], sources: [hvr-ghc]}}+ - env: CABALVER=1.16 GHCVER=7.4.2+ compiler: ": #GHC 7.4.2"+ addons: {apt: {packages: [cabal-install-1.16,ghc-7.4.2], sources: [hvr-ghc]}}+ - env: CABALVER=1.16 GHCVER=7.6.3+ compiler: ": #GHC 7.6.3"+ addons: {apt: {packages: [cabal-install-1.16,ghc-7.6.3], sources: [hvr-ghc]}}+ - env: CABALVER=1.18 GHCVER=7.8.4+ compiler: ": #GHC 7.8.4"+ addons: {apt: {packages: [cabal-install-1.18,ghc-7.8.4], sources: [hvr-ghc]}}+ - env: CABALVER=1.22 GHCVER=7.10.2+ compiler: ": #GHC 7.10.2"+ addons: {apt: {packages: [cabal-install-1.22,ghc-7.10.2], sources: [hvr-ghc]}}++before_install:+ - unset CC+ - export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$PATH++install:+ - cabal --version+ - echo "$(ghc --version) [$(ghc --print-project-git-commit-id 2> /dev/null || echo '?')]"+ - if [ -f $HOME/.cabal/packages/hackage.haskell.org/00-index.tar.gz ];+ then+ zcat $HOME/.cabal/packages/hackage.haskell.org/00-index.tar.gz >+ $HOME/.cabal/packages/hackage.haskell.org/00-index.tar;+ fi+ - travis_retry cabal update -v+ - sed -i 's/^jobs:/-- jobs:/' ${HOME}/.cabal/config+ - cabal install --only-dependencies --enable-tests --enable-benchmarks --dry -v > installplan.txt+ - sed -i -e '1,/^Resolving /d' installplan.txt; cat installplan.txt++# check whether current requested install-plan matches cached package-db snapshot+ - if diff -u installplan.txt $HOME/.cabsnap/installplan.txt;+ then+ echo "cabal build-cache HIT";+ rm -rfv .ghc;+ cp -a $HOME/.cabsnap/ghc $HOME/.ghc;+ cp -a $HOME/.cabsnap/lib $HOME/.cabsnap/share $HOME/.cabsnap/bin $HOME/.cabal/;+ else+ echo "cabal build-cache MISS";+ rm -rf $HOME/.cabsnap;+ mkdir -p $HOME/.ghc $HOME/.cabal/lib $HOME/.cabal/share $HOME/.cabal/bin;+ cabal install --only-dependencies --enable-tests --enable-benchmarks;+ fi+ +# snapshot package-db on cache miss+ - if [ ! -d $HOME/.cabsnap ];+ then+ echo "snapshotting package-db to build-cache";+ mkdir $HOME/.cabsnap;+ cp -a $HOME/.ghc $HOME/.cabsnap/ghc;+ cp -a $HOME/.cabal/lib $HOME/.cabal/share $HOME/.cabal/bin installplan.txt $HOME/.cabsnap/;+ fi++# Here starts the actual work to be performed for the package under test;+# any command which exits with a non-zero exit code causes the build to fail.+script:+ - if [ -f configure.ac ]; then autoreconf -i; fi+ - cabal configure --enable-tests --enable-benchmarks -v2 # -v2 provides useful information for debugging+ - cabal build # this builds all libraries and executables (including tests/benchmarks)+ - cabal test+ - cabal sdist # tests that a source-distribution can be generated++# Check that the resulting source distribution can be built & installed.+# If there are no other `.tar.gz` files in `dist`, this can be even simpler:+# `cabal install --force-reinstalls dist/*-*.tar.gz`+ - SRC_TGZ=$(cabal info . | awk '{print $2;exit}').tar.gz &&+ (cd dist && cabal install --force-reinstalls "$SRC_TGZ")++# EOF
CHANGELOG.markdown view
@@ -1,3 +1,7 @@+0.1+-----+* Added functions `floor`, `ceil`, `trunc`, `modf` and `remainder`+ 0.0.3 ----- * Marked `Numeric.Extras` `Trustworthy`.
Numeric/Extras.hs view
@@ -7,9 +7,20 @@ ( RealExtras(..) ) where +#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ < 710+import Control.Applicative ((<$>), (<*>))+#endif+import Control.Arrow ((***)) import Foreign import Foreign.C.Types+#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 702+import System.IO.Unsafe (unsafeDupablePerformIO)+#else+import System.IO.Unsafe (unsafePerformIO)+#endif +{-# ANN module "HLint: ignore Use camelCase" #-}+ class (Storable (C a), RealFloat (C a), RealFloat a) => RealExtras a where type C a :: * fmod :: a -> a -> a@@ -18,6 +29,11 @@ hypot :: a -> a -> a cbrt :: a -> a erf :: a -> a+ floor :: a -> a+ ceil :: a -> a+ trunc :: a -> a+ modf :: a -> (a, a)+ remainder :: a -> a -> a instance RealExtras Double where type C Double = CDouble@@ -27,15 +43,31 @@ hypot = lift2D c_hypot cbrt = lift1D c_cbrt erf = lift1D c_erf+ floor = lift1D c_floor+ ceil = lift1D c_ceil+ trunc = lift1D c_trunc+ modf = lift1D2 c_modf+ remainder = lift2D c_remainder lift1D :: (CDouble -> CDouble) -> Double -> Double lift1D f a = realToFrac (f (realToFrac a)) {-# INLINE lift1D #-} +lift1D2 :: (CDouble -> (CDouble, CDouble)) -> Double -> (Double, Double)+lift1D2 f a = (realToFrac *** realToFrac) (f (realToFrac a))+{-# INLINE lift1D2 #-}+ lift2D :: (CDouble -> CDouble -> CDouble) -> Double -> Double -> Double lift2D f a b = realToFrac (f (realToFrac a) (realToFrac b)) {-# INLINE lift2D #-} +c_modf :: CDouble -> (CDouble, CDouble)+#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 702+c_modf a = unsafeDupablePerformIO $ alloca $ \i -> (,) <$> c_modf_imp a i <*> peek i+#else+c_modf a = unsafePerformIO $ alloca $ \i -> (,) <$> c_modf_imp a i <*> peek i+#endif+ instance RealExtras Float where type C Float = CFloat fmod = lift2F c_fmodf@@ -44,39 +76,75 @@ hypot = lift2F c_hypotf cbrt = lift1F c_cbrtf erf = lift1F c_erff+ floor = lift1F c_floorf+ ceil = lift1F c_ceilf+ trunc = lift1F c_truncf+ modf = lift1F2 c_modff+ remainder = lift2F c_remainderf lift1F :: (CFloat -> CFloat) -> Float -> Float lift1F f a = realToFrac (f (realToFrac a)) {-# INLINE lift1F #-} +lift1F2 :: (CFloat -> (CFloat, CFloat)) -> Float -> (Float, Float)+lift1F2 f a = (realToFrac *** realToFrac) (f (realToFrac a))+{-# INLINE lift1F2 #-}+ lift2F :: (CFloat -> CFloat -> CFloat) -> Float -> Float -> Float lift2F f a b = realToFrac (f (realToFrac a) (realToFrac b)) {-# INLINE lift2F #-} -foreign import ccall unsafe "math.h fmod" +c_modff :: CFloat -> (CFloat, CFloat)+#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 702+c_modff a = unsafeDupablePerformIO $ alloca $ \i -> (,) <$> c_modff_imp a i <*> peek i+#else+c_modff a = unsafePerformIO $ alloca $ \i -> (,) <$> c_modff_imp a i <*> peek i+#endif++foreign import ccall unsafe "math.h fmod" c_fmod :: CDouble -> CDouble -> CDouble-foreign import ccall unsafe "math.h expm1" +foreign import ccall unsafe "math.h expm1" c_expm1 :: CDouble -> CDouble-foreign import ccall unsafe "math.h log1p" +foreign import ccall unsafe "math.h log1p" c_log1p :: CDouble -> CDouble-foreign import ccall unsafe "math.h hypot" +foreign import ccall unsafe "math.h hypot" c_hypot :: CDouble -> CDouble -> CDouble-foreign import ccall unsafe "math.h cbrt" +foreign import ccall unsafe "math.h cbrt" c_cbrt :: CDouble -> CDouble foreign import ccall unsafe "math.h erf" c_erf :: CDouble -> CDouble+foreign import ccall unsafe "math.h floor"+ c_floor :: CDouble -> CDouble+foreign import ccall unsafe "math.h ceil"+ c_ceil :: CDouble -> CDouble+foreign import ccall unsafe "math.h trunc"+ c_trunc :: CDouble -> CDouble+foreign import ccall unsafe "math.h modf"+ c_modf_imp :: CDouble -> Ptr CDouble -> IO CDouble+foreign import ccall unsafe "math.h remainder"+ c_remainder :: CDouble -> CDouble -> CDouble -foreign import ccall unsafe "math.h fmodf" +foreign import ccall unsafe "math.h fmodf" c_fmodf :: CFloat -> CFloat -> CFloat-foreign import ccall unsafe "math.h expm1f" +foreign import ccall unsafe "math.h expm1f" c_expm1f :: CFloat -> CFloat-foreign import ccall unsafe "math.h log1pf" +foreign import ccall unsafe "math.h log1pf" c_log1pf :: CFloat -> CFloat-foreign import ccall unsafe "math.h hypotf" +foreign import ccall unsafe "math.h hypotf" c_hypotf :: CFloat -> CFloat -> CFloat-foreign import ccall unsafe "math.h cbrtf" +foreign import ccall unsafe "math.h cbrtf" c_cbrtf :: CFloat -> CFloat foreign import ccall unsafe "math.h erff" c_erff :: CFloat -> CFloat+foreign import ccall unsafe "math.h floorf"+ c_floorf :: CFloat -> CFloat+foreign import ccall unsafe "math.h ceilf"+ c_ceilf :: CFloat -> CFloat+foreign import ccall unsafe "math.h truncf"+ c_truncf :: CFloat -> CFloat+foreign import ccall unsafe "math.h modff"+ c_modff_imp :: CFloat -> Ptr CFloat -> IO CFloat+foreign import ccall unsafe "math.h remainderf"+ c_remainderf :: CFloat -> CFloat -> CFloat default (Double)
numeric-extras.cabal view
@@ -1,6 +1,7 @@ name: numeric-extras-version: 0.0.3+version: 0.1 synopsis: Useful tools from the C standard library+description: Useful tools from the C standard library homepage: http://github.com/ekmett/numeric-extras bug-reports: http://github.com/ekmett/numeric-extras/issues license: BSD3@@ -10,6 +11,8 @@ category: Math build-type: Simple cabal-version: >=1.6+tested-with: GHC ==7.0.4, GHC ==7.2.2, GHC ==7.4.2,+ GHC ==7.6.3, GHC ==7.8.4, GHC ==7.10.2 extra-source-files: .travis.yml CHANGELOG.markdown