numeric-extras-0.1/0000755000000000000000000000000012602103030012471 5ustar0000000000000000numeric-extras-0.1/.travis.yml0000644000000000000000000000710412602103030014604 0ustar0000000000000000# 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 numeric-extras-0.1/CHANGELOG.markdown0000644000000000000000000000020312602103030015517 0ustar00000000000000000.1 ----- * Added functions `floor`, `ceil`, `trunc`, `modf` and `remainder` 0.0.3 ----- * Marked `Numeric.Extras` `Trustworthy`. numeric-extras-0.1/LICENSE0000644000000000000000000000276212602103030013505 0ustar0000000000000000Copyright (c) 2010, Edward Kmett All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Edward Kmett nor the names of other contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. numeric-extras-0.1/numeric-extras.cabal0000644000000000000000000000167312602103030016432 0ustar0000000000000000name: numeric-extras 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 license-file: LICENSE author: Edward Kmett maintainer: ekmett@gmail.com 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 source-repository head type: git location: git://github.com/ekmett/numeric-extras.git library other-extensions: ForeignFunctionInterface FlexibleContexts TypeFamilies exposed-modules: Numeric.Extras build-depends: base >= 4 && < 5 ghc-options: -Wall -O2 numeric-extras-0.1/Setup.lhs0000644000000000000000000000014512602103030014301 0ustar0000000000000000#!/usr/bin/env runhaskell > import Distribution.Simple > main = defaultMainWithHooks simpleUserHooks numeric-extras-0.1/Numeric/0000755000000000000000000000000012602103030014073 5ustar0000000000000000numeric-extras-0.1/Numeric/Extras.hs0000644000000000000000000001147512602103030015705 0ustar0000000000000000{-# LANGUAGE ForeignFunctionInterface, FlexibleContexts, TypeFamilies #-} {-# LANGUAGE CPP #-} #if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 702 {-# LANGUAGE Trustworthy #-} #endif module Numeric.Extras ( 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 expm1 :: a -> a log1p :: a -> a 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 fmod = lift2D c_fmod expm1 = lift1D c_expm1 log1p = lift1D c_log1p 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 expm1 = lift1F c_expm1f log1p = lift1F c_log1pf 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 #-} 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" c_expm1 :: CDouble -> CDouble foreign import ccall unsafe "math.h log1p" c_log1p :: CDouble -> CDouble foreign import ccall unsafe "math.h hypot" c_hypot :: CDouble -> CDouble -> CDouble 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" c_fmodf :: CFloat -> CFloat -> CFloat foreign import ccall unsafe "math.h expm1f" c_expm1f :: CFloat -> CFloat foreign import ccall unsafe "math.h log1pf" c_log1pf :: CFloat -> CFloat foreign import ccall unsafe "math.h hypotf" c_hypotf :: CFloat -> CFloat -> CFloat 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)