dimensional 1.5 → 1.6
raw patch · 13 files changed
+99/−42 lines, 13 filesdep +binarydep −Globdep −doctestdep −template-haskelldep ~basePVP ok
version bump matches the API change (PVP)
Dependencies added: binary
Dependencies removed: Glob, doctest, template-haskell
Dependency ranges changed: base
API changes (from Hackage documentation)
- Numeric.Units.Dimensional: data family Dimensional v :: Dimension -> Type -> Type
- Numeric.Units.Dimensional.Coercion: data family Dimensional v :: Dimension -> Type -> Type
- Numeric.Units.Dimensional.FixedPoint: data family Dimensional v :: Dimension -> Type -> Type
- Numeric.Units.Dimensional.Prelude: data family Dimensional v :: Dimension -> Type -> Type;
+ Numeric.Units.Dimensional: data Dimensional v :: Dimension -> Type -> Type
+ Numeric.Units.Dimensional.Coercion: data Dimensional v :: Dimension -> Type -> Type
+ Numeric.Units.Dimensional.FixedPoint: data Dimensional v :: Dimension -> Type -> Type
+ Numeric.Units.Dimensional.Prelude: class a ~# b => (a :: k) ~ (b :: k)
+ Numeric.Units.Dimensional.Prelude: data Dimensional v :: Dimension -> Type -> Type;
+ Numeric.Units.Dimensional.Prelude: liftA2 :: Applicative f => (a -> b -> c) -> f a -> f b -> f c
+ Numeric.Units.Dimensional.SIUnits: quecto :: Fractional a => Unit 'Metric d a -> Unit 'NonMetric d a
+ Numeric.Units.Dimensional.SIUnits: quetta :: Num a => Unit 'Metric d a -> Unit 'NonMetric d a
+ Numeric.Units.Dimensional.SIUnits: ronna :: Num a => Unit 'Metric d a -> Unit 'NonMetric d a
+ Numeric.Units.Dimensional.SIUnits: ronto :: Fractional a => Unit 'Metric d a -> Unit 'NonMetric d a
- Numeric.Units.Dimensional.Coercion: coerce :: forall (k :: RuntimeRep) (a :: TYPE k) (b :: TYPE k). Coercible a b => a -> b
+ Numeric.Units.Dimensional.Coercion: coerce :: forall {k :: RuntimeRep} (a :: TYPE k) (b :: TYPE k). Coercible a b => a -> b
- Numeric.Units.Dimensional.Prelude: (!!) :: [a] -> Int -> a
+ Numeric.Units.Dimensional.Prelude: (!!) :: HasCallStack => [a] -> Int -> a
- Numeric.Units.Dimensional.Prelude: class Bounded a
+ Numeric.Units.Dimensional.Prelude: class () => Bounded a
- Numeric.Units.Dimensional.Prelude: class Category (cat :: k -> k -> Type)
+ Numeric.Units.Dimensional.Prelude: class () => Category (cat :: k -> k -> Type)
- Numeric.Units.Dimensional.Prelude: class Enum a
+ Numeric.Units.Dimensional.Prelude: class () => Enum a
- Numeric.Units.Dimensional.Prelude: class Eq a
+ Numeric.Units.Dimensional.Prelude: class () => Eq a
- Numeric.Units.Dimensional.Prelude: class Foldable (t :: Type -> Type)
+ Numeric.Units.Dimensional.Prelude: class () => Foldable (t :: Type -> Type)
- Numeric.Units.Dimensional.Prelude: class Functor (f :: Type -> Type)
+ Numeric.Units.Dimensional.Prelude: class () => Functor (f :: Type -> Type)
- Numeric.Units.Dimensional.Prelude: class Num a
+ Numeric.Units.Dimensional.Prelude: class () => Num a
- Numeric.Units.Dimensional.Prelude: class Read a
+ Numeric.Units.Dimensional.Prelude: class () => Read a
- Numeric.Units.Dimensional.Prelude: class Semigroup a
+ Numeric.Units.Dimensional.Prelude: class () => Semigroup a
- Numeric.Units.Dimensional.Prelude: class Show a
+ Numeric.Units.Dimensional.Prelude: class () => Show a
- Numeric.Units.Dimensional.Prelude: cycle :: [a] -> [a]
+ Numeric.Units.Dimensional.Prelude: cycle :: HasCallStack => [a] -> [a]
- Numeric.Units.Dimensional.Prelude: data Bool
+ Numeric.Units.Dimensional.Prelude: data () => Bool
- Numeric.Units.Dimensional.Prelude: data Char
+ Numeric.Units.Dimensional.Prelude: data () => Char
- Numeric.Units.Dimensional.Prelude: data Double
+ Numeric.Units.Dimensional.Prelude: data () => Double
- Numeric.Units.Dimensional.Prelude: data Either a b
+ Numeric.Units.Dimensional.Prelude: data () => Either a b
- Numeric.Units.Dimensional.Prelude: data Float
+ Numeric.Units.Dimensional.Prelude: data () => Float
- Numeric.Units.Dimensional.Prelude: data IO a
+ Numeric.Units.Dimensional.Prelude: data () => IO a
- Numeric.Units.Dimensional.Prelude: data Int
+ Numeric.Units.Dimensional.Prelude: data () => Int
- Numeric.Units.Dimensional.Prelude: data Integer
+ Numeric.Units.Dimensional.Prelude: data () => Integer
- Numeric.Units.Dimensional.Prelude: data Maybe a
+ Numeric.Units.Dimensional.Prelude: data () => Maybe a
- Numeric.Units.Dimensional.Prelude: data Ordering
+ Numeric.Units.Dimensional.Prelude: data () => Ordering
- Numeric.Units.Dimensional.Prelude: data Word
+ Numeric.Units.Dimensional.Prelude: data () => Word
- Numeric.Units.Dimensional.Prelude: head :: [a] -> a
+ Numeric.Units.Dimensional.Prelude: head :: HasCallStack => [a] -> a
- Numeric.Units.Dimensional.Prelude: infixl 6 -
+ Numeric.Units.Dimensional.Prelude: infixl 6 +
- Numeric.Units.Dimensional.Prelude: infixl 7 `quot`
+ Numeric.Units.Dimensional.Prelude: infixl 7 `mod`
- Numeric.Units.Dimensional.Prelude: init :: [a] -> [a]
+ Numeric.Units.Dimensional.Prelude: init :: HasCallStack => [a] -> [a]
- Numeric.Units.Dimensional.Prelude: last :: [a] -> a
+ Numeric.Units.Dimensional.Prelude: last :: HasCallStack => [a] -> a
- Numeric.Units.Dimensional.Prelude: seq :: forall (r :: RuntimeRep) a (b :: TYPE r). a -> b -> b
+ Numeric.Units.Dimensional.Prelude: seq :: forall {r :: RuntimeRep} a (b :: TYPE r). a -> b -> b
- Numeric.Units.Dimensional.Prelude: tail :: [a] -> [a]
+ Numeric.Units.Dimensional.Prelude: tail :: HasCallStack => [a] -> [a]
- Numeric.Units.Dimensional.Prelude: type family (a :: Dimension) * (b :: Dimension)
+ Numeric.Units.Dimensional.Prelude: type family NRoot (d :: Dimension) (x :: TypeInt)
Files
- CHANGELOG.md +6/−1
- README.md +15/−1
- dimensional.cabal +17/−16
- src/Numeric/Units/Dimensional.hs +2/−0
- src/Numeric/Units/Dimensional/Dimensions/TermLevel.hs +13/−0
- src/Numeric/Units/Dimensional/Dynamic.hs +12/−0
- src/Numeric/Units/Dimensional/Float.hs +1/−0
- src/Numeric/Units/Dimensional/Internal.hs +8/−0
- src/Numeric/Units/Dimensional/NonSI.hs +1/−0
- src/Numeric/Units/Dimensional/Quantities.hs +1/−0
- src/Numeric/Units/Dimensional/SIUnits.hs +14/−4
- src/Numeric/Units/Dimensional/UnitNames/Internal.hs +9/−3
- tests/DocTests.hs +0/−17
CHANGELOG.md view
@@ -1,6 +1,11 @@+1.6 (2024-08)+-------------++* Added a package flag `binary`, enabling optional dependency on the `binary` package to provide instances of `Binary`.+ 1.5 (2022-06) --------------* Add Julian `decade`, `century`, and `millennium` to `NonSI`.+* Add Julian `decade` and `millennium` to `NonSI`. * Rename `deka` prefix to `deca` in accordance with [international spelling](https://www.bipm.org/documents/20126/41483022/SI-Brochure-9.pdf/fcf090b2-04e6-88cc-1149-c3e029ad8232). * Change `astronomicalUnit` symbol to lowercase (`au`). * Remove `semigroups` dependency.
README.md view
@@ -5,7 +5,6 @@ Data kinds and closed type families provide a flexible, safe, and discoverable implementation that leads to largely self-documenting client code. -[](https://app.travis-ci.com/github/bjornbm/dimensional) [](https://hackage.haskell.org/package/dimensional) [](https://www.stackage.org/package/dimensional) @@ -62,6 +61,21 @@ putStrLn $ "Average speed is: " ++ showIn (mile / hour) averageSpeed putStrLn $ "If we don't want to be explicit about units, the show instance uses the SI basis: " ++ show averageSpeed putStrLn $ "The journey requires " ++ show wholeSeconds ++ " seconds, rounded up to the nearest second."+```++## Package Flags++To provide `Binary` serialization for `Quantity` from the `binary` package, the `binary` flag can be used like so:++```bash+cabal install dimensional -f binary+```++If you use a `cabal.project` file, you can instead add the following clause to activate this package flag:++```txt+package dimensional+ flags: +binary ``` ## Contributing
dimensional.cabal view
@@ -1,8 +1,8 @@ name: dimensional-version: 1.5+version: 1.6 license: BSD3 license-file: LICENSE-copyright: Bjorn Buckwalter 2006-2022+copyright: Bjorn Buckwalter 2006-2024 author: Bjorn Buckwalter maintainer: bjorn@buckwalter.se stability: experimental@@ -11,7 +11,13 @@ category: Math, Physics synopsis: Statically checked physical dimensions cabal-version: >= 1.10-tested-with: GHC == 8.0.1, GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.4, GHC == 8.6.1, GHC == 8.8.3, GHC == 8.10.4+tested-with: GHC == 8.10.7,+ GHC == 9.0.2,+ GHC == 9.2.8,+ GHC == 9.4.8,+ GHC == 9.6.6,+ GHC == 9.8.2,+ GHC == 9.10.1 build-type: Simple description:@@ -37,6 +43,11 @@ examples/GM.lhs, examples/NewtonianMechanics.hs +flag binary+ description: Provide instances for use with the binary package.+ default: False+ manual: True+ source-repository head type: git location: https://github.com/bjornbm/dimensional/@@ -72,6 +83,9 @@ Numeric.Units.Dimensional.Float other-modules: Numeric.Units.Dimensional.Internal Numeric.Units.Dimensional.UnitNames.Internal+ if flag(binary)+ build-depends: binary >= 0.7 && < 1+ cpp-options: -DUSE_BINARY test-suite tests type: exitcode-stdio-1.0@@ -90,19 +104,6 @@ QuickCheck, base build-tool-depends: hspec-discover:hspec-discover == 2.*--test-suite doctests- type: exitcode-stdio-1.0- ghc-options: -threaded- main-is: DocTests.hs- hs-source-dirs: tests- default-language: Haskell2010- build-depends: dimensional,- doctest,- Glob,- QuickCheck,- template-haskell,- base benchmark simple type: exitcode-stdio-1.0
src/Numeric/Units/Dimensional.hs view
@@ -240,6 +240,8 @@ -- $setup -- >>> :set -XFlexibleInstances -- >>> :set -XNoImplicitPrelude+-- >>> :set -fno-warn-orphans+-- >>> :set -fno-warn-type-defaults -- >>> import Test.QuickCheck.Arbitrary -- >>> import Numeric.Units.Dimensional.Prelude -- >>> import Numeric.Units.Dimensional.Float
src/Numeric/Units/Dimensional/Dimensions/TermLevel.hs view
@@ -1,6 +1,7 @@ {-# OPTIONS_HADDOCK not-home, show-extensions #-} {-# LANGUAGE BangPatterns #-}+{-# LANGUAGE CPP #-} {-# LANGUAGE DefaultSignatures #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-}@@ -36,6 +37,9 @@ where import Control.DeepSeq+#if USE_BINARY+import qualified Data.Binary+#endif import Data.Data import Data.Semigroup (Semigroup(..)) import Data.Monoid (Monoid(..))@@ -44,6 +48,7 @@ import qualified Prelude as P -- $setup+-- >>> :set -fno-warn-orphans -- >>> import Prelude (negate) -- >>> import Control.Applicative -- >>> import Test.QuickCheck.Arbitrary@@ -66,6 +71,10 @@ mempty = dOne mappend = (<>) +#if USE_BINARY+instance Data.Binary.Binary Dimension'+#endif+ -- | The dimension of a dynamic value, which may not have any dimension at all. data DynamicDimension = NoDimension -- ^ The value has no valid dimension. | SomeDimension Dimension' -- ^ The value has the given dimension.@@ -73,6 +82,10 @@ deriving (Eq, Ord, Show, Data, Generic, Typeable) instance NFData DynamicDimension where++#if USE_BINARY+instance Data.Binary.Binary DynamicDimension+#endif -- | Dimensional values, or those that are only possibly dimensional, inhabit this class, -- which allows access to a term-level representation of their dimension.
src/Numeric/Units/Dimensional/Dynamic.hs view
@@ -9,6 +9,7 @@ Defines types for manipulation of units and quantities without phantom types for their dimensions. -} +{-# LANGUAGE CPP #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-}@@ -37,6 +38,9 @@ import Control.DeepSeq import Control.Monad+#if USE_BINARY+import qualified Data.Binary+#endif import Data.Data import Data.ExactPi import Data.Kind@@ -115,6 +119,10 @@ mempty = demoteQuantity (1 Dim.*~ one) mappend = (<>) +#if USE_BINARY+instance (Data.Binary.Binary a) => Data.Binary.Binary (AnyQuantity a)+#endif+ -- | Possibly a 'Quantity' whose 'Dimension' is only known dynamically. -- -- By modeling the absence of a value, this type differs from 'AnyQuantity' in that it may@@ -193,6 +201,10 @@ instance Num a => Monoid (DynQuantity a) where mempty = demoteQuantity (1 Dim.*~ one) mappend = (<>)++#if USE_BINARY+instance (Data.Binary.Binary a) => Data.Binary.Binary (DynQuantity a)+#endif -- | A 'DynQuantity' which does not correspond to a value of any dimension. invalidQuantity :: DynQuantity a
src/Numeric/Units/Dimensional/Float.hs view
@@ -45,6 +45,7 @@ import Numeric.Units.Dimensional.Coercion -- $setup+-- >>> :set -fno-warn-type-defaults -- >>> :set -XExtendedDefaultRules -- >>> :set -XNegativeLiterals
src/Numeric/Units/Dimensional/Internal.hs view
@@ -28,6 +28,9 @@ import Control.Applicative import Control.DeepSeq import Data.AEq (AEq)+#if USE_BINARY+import qualified Data.Binary+#endif import Data.Coerce (coerce) import Data.Data import Data.Kind@@ -57,6 +60,7 @@ -- $setup -- >>> :set -XNoImplicitPrelude+-- >>> :set -fno-warn-type-defaults -- >>> import Numeric.Units.Dimensional.Prelude -- | A unit of measurement.@@ -136,6 +140,10 @@ instance (Num a) => Monoid (SQuantity s d a) where mempty = Quantity 0 mappend = (<>)++#if USE_BINARY+deriving instance (Data.Binary.Binary a) => Data.Binary.Binary (SQuantity s d a)+#endif {-
src/Numeric/Units/Dimensional/NonSI.hs view
@@ -85,6 +85,7 @@ import qualified Prelude -- $setup+-- >>> :set -fno-warn-type-defaults -- >>> import Data.ExactPi -- >>> import Data.Function (on) -- >>> import Numeric.Units.Dimensional.Coercion
src/Numeric/Units/Dimensional/Quantities.hs view
@@ -418,6 +418,7 @@ -} -- $setup+-- >>> :set -fno-warn-type-defaults -- >>> import Numeric.Units.Dimensional.Prelude -- | Constructs a unit of area from a unit of length, taking the area of a square whose sides are that length.
src/Numeric/Units/Dimensional/SIUnits.hs view
@@ -52,9 +52,9 @@ astronomicalUnit, -- * SI Prefixes -- $multiples- deka, deca, hecto, kilo, mega, giga, tera, peta, exa, zetta, yotta,+ deka, deca, hecto, kilo, mega, giga, tera, peta, exa, zetta, yotta, ronna, quetta, -- $submultiples- deci, centi, milli, micro, nano, pico, femto, atto, zepto, yocto,+ deci, centi, milli, micro, nano, pico, femto, atto, zepto, yocto, ronto, quecto, -- $reified-prefixes Prefix, applyPrefix, siPrefixes )@@ -88,7 +88,7 @@ n' = N.applyPrefix p (name u) x = N.scaleFactor p -deca, deka, hecto, kilo, mega, giga, tera, peta, exa, zetta, yotta+deca, deka, hecto, kilo, mega, giga, tera, peta, exa, zetta, yotta, ronna, quetta :: Num a => Unit 'Metric d a -> Unit 'NonMetric d a -- | The "deca" prefix, denoting a factor of 10. deca = applyMultiple I.deca -- International English.@@ -112,7 +112,12 @@ zetta = applyMultiple I.zetta -- | The "yotta" prefix, denoting a factor of 10^24. yotta = applyMultiple I.yotta+-- | The "ronna" prefix, denoting a factor of 10^27.+ronna = applyMultiple I.ronna+-- | The "quetta" prefix, denoting a factor of 10^30.+quetta = applyMultiple I.quetta + {- $submultiples Then the submultiples. -}@@ -124,7 +129,7 @@ n' = N.applyPrefix p (name u) x = N.scaleFactor p -deci, centi, milli, micro, nano, pico, femto, atto, zepto, yocto+deci, centi, milli, micro, nano, pico, femto, atto, zepto, yocto, ronto, quecto :: Fractional a => Unit 'Metric d a -> Unit 'NonMetric d a -- | The "deci" prefix, denoting a factor of 0.1. deci = applyPrefix I.deci@@ -146,6 +151,11 @@ zepto = applyPrefix I.zepto -- | The "yocto" prefix, denoting a factor of 10^-24. yocto = applyPrefix I.yocto+-- | The "ronto" prefix, denoting a factor of 10^-27.+ronto = applyPrefix I.ronto+-- | The "quecto" prefix, denoting a factor of 10^-30.+quecto = applyPrefix I.quecto+ {- $reified-prefixes
src/Numeric/Units/Dimensional/UnitNames/Internal.hs view
@@ -187,7 +187,7 @@ baseUnitNames :: [UnitName 'NonMetric] baseUnitNames = [weaken nMeter, nKilogram, weaken nSecond, weaken nAmpere, weaken nKelvin, weaken nMole, weaken nCandela] -deca, hecto, kilo, mega, giga, tera, peta, exa, zetta, yotta :: Prefix+deca, hecto, kilo, mega, giga, tera, peta, exa, zetta, yotta, ronna, quetta :: Prefix deca = prefix "da" "da" "deca" 1e1 hecto = prefix "h" "h" "hecto" 1e2 kilo = prefix "k" "k" "kilo" 1e3@@ -198,7 +198,10 @@ exa = prefix "E" "E" "exa" 1e18 zetta = prefix "Z" "Z" "zetta" 1e21 yotta = prefix "Y" "Y" "yotta" 1e24-deci, centi, milli, micro, nano, pico, femto, atto, zepto, yocto :: Prefix+ronna = prefix "R" "R" "ronna" 1e27+quetta = prefix "Q" "Q" "quetta" 1e30++deci, centi, milli, micro, nano, pico, femto, atto, zepto, yocto, ronto, quecto :: Prefix deci = prefix "d" "d" "deci" 1e-1 centi = prefix "c" "c" "centi" 1e-2 milli = prefix "m" "m" "milli" 1e-3@@ -209,10 +212,13 @@ atto = prefix "a" "a" "atto" 1e-18 zepto = prefix "z" "z" "zepto" 1e-21 yocto = prefix "y" "y" "yocto" 1e-24+ronto = prefix "r" "r" "ronto" 1e-27+quecto = prefix "q" "q" "quecto" 1e-30 + -- | A list of all 'Prefix'es defined by the SI. siPrefixes :: [Prefix]-siPrefixes = [yocto, zepto, atto, femto, pico, nano, micro, milli, centi, deci, deca, hecto, kilo, mega, giga, tera, peta, exa, zetta, yotta]+siPrefixes = [quecto, ronto, yocto, zepto, atto, femto, pico, nano, micro, milli, centi, deci, deca, hecto, kilo, mega, giga, tera, peta, exa, zetta, yotta, ronna, quetta] -- | Forms a 'UnitName' from a 'Metric' name by applying a metric prefix. applyPrefix :: Prefix -> UnitName 'Metric -> UnitName 'NonMetric
− tests/DocTests.hs
@@ -1,17 +0,0 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE TypeSynonymInstances #-}--module Main (main) where--import System.FilePath.Glob (glob)-import Test.DocTest (doctest)--#if MIN_VERSION_base(4,12,0)-doctestFlags = ["-XNoStarIsType"]-#else-doctestFlags = []-#endif--main :: IO ()-main = glob "src/**/*.hs" >>= (doctest . (doctestFlags++))