floating: Merge Data.Floating.Types and Data.Floating.Classes.
authorNick Bowler <nbowler@draconx.ca>
Tue, 23 Feb 2010 23:41:19 +0000 (23 18:41 -0500)
committerNick Bowler <nbowler@draconx.ca>
Wed, 24 Feb 2010 03:02:34 +0000 (23 22:02 -0500)
The module dependency graph of altfloat has become too complicated for
mere humans to understand.  This is the first part of a massive cleanup.

12 files changed:
Data/Floating.hs
Data/Floating/CMath.hs
Data/Floating/CMath/Complex.hs
Data/Floating/CMath/Instances.hs
Data/Floating/Environment.hs
Data/Floating/Helpers.hs
Data/Floating/Instances.hs
Data/Floating/Types.hs [deleted file]
Data/Floating/Types/Core.hs [moved from Data/Floating/Classes.hs with 69% similarity]
Data/Floating/Types/Double.hs
Data/Floating/Types/Float.hs
altfloat.cabal

index 6dbd5bc..7c71c10 100644 (file)
@@ -8,16 +8,14 @@
 
 -- | Top level module for alternative floating point support.
 module Data.Floating (
-    module Data.Floating.Classes,
     Double, Float,
+    module Data.Floating.Types.Core,
     module Data.Floating,
-    toFloating
 ) where
 
 import Prelude hiding (RealFloat(..), RealFrac(..), Double, Float)
-import Data.Floating.Classes
+import Data.Floating.Types.Core hiding (Double, Float, FloatConvert)
 import Data.Floating.Instances
-import Data.Floating.Types
 import Data.Floating.Types.Double
 import Data.Floating.Types.Float
 import Data.Floating.Environment
index ce6090e..f7aeaeb 100644 (file)
@@ -53,7 +53,7 @@ module Data.Floating.CMath (
 
 import Prelude hiding (Double, Float)
 
-import Data.Floating.Types
+import Data.Floating.Types.Core
 import Foreign
 import Foreign.C
 
index 411b3a7..24db29d 100644 (file)
@@ -34,8 +34,7 @@ module Data.Floating.CMath.Complex (
 ) where
 
 import Data.Floating.CMath.Instances
-import Data.Floating.Classes
-import Data.Floating.Types
+import Data.Floating.Types.Core
 
 import Foreign
 import Foreign.C
index 92084b3..4090c75 100644 (file)
 module Data.Floating.CMath.Instances where
 
 import Prelude (($), (.), const, undefined)
-import Data.Floating.Classes
-import Data.Floating.Types
 import Data.Floating.Types.Double
 import Data.Floating.Types.Float
+import Data.Floating.Types.Core
 import Foreign.C
 
 import Data.Poset
index 74b2015..bab6e4c 100644 (file)
@@ -61,7 +61,7 @@ module Data.Floating.Environment (
 
 import Prelude hiding (Float, Double, Floating(..), RealFloat(..))
 
-import Data.Floating.Classes
+import Data.Floating.Types.Core
 import Control.Exception
 import Control.Applicative
 import Control.Monad
index 64a2194..ca9a443 100644 (file)
@@ -13,8 +13,7 @@ module Data.Floating.Helpers (
 ) where
 
 import Prelude hiding (Double, RealFloat(..), RealFrac(..))
-import Data.Floating.Types
-import Data.Floating.Classes
+import Data.Floating.Types.Core
 import Data.Floating.Instances
 import Data.Ratio
 import Data.Maybe
index 21f19d7..59906c6 100644 (file)
@@ -10,7 +10,7 @@ module Data.Floating.Instances where
 
 import qualified Prelude
 import Prelude hiding (round, floor, ceiling, truncate)
-import Data.Floating.Classes
+import Data.Floating.Types.Core
 import Data.Ratio
 
 instance Integral a => Roundable (Ratio a) where
diff --git a/Data/Floating/Types.hs b/Data/Floating/Types.hs
deleted file mode 100644 (file)
index 8c84401..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-{-
- - Copyright (C) 2009-2010 Nick Bowler.
- -
- - License BSD2:  2-clause BSD license.  See LICENSE for full terms.
- - This is free software: you are free to change and redistribute it.
- - There is NO WARRANTY, to the extent permitted by law.
- -}
-
--- | Definition of the core floating point types and basic manipulation of
--- them.
-{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, OverlappingInstances #-}
-{-# LANGUAGE MagicHash #-}
-module Data.Floating.Types (
-    Double(..), Float(..), FloatConvert(..), Complex(..)
-) where
-
-import Prelude hiding (Double, Float)
-import qualified GHC.Exts as GHC
-import GHC.Integer
-import GHC.Prim
-import Foreign.C
-
-import Data.Floating.Classes
-import Data.Ratio
-
-import Unsafe.Coerce
-
--- | The Double type.  This is expected to be an identical declaration to
--- the one found in GHC.Prim.  We avoid simply using GHC's type because we need 
--- to define our own class instances.
-data Double = D# Double#
-
--- | The Float type. 
-data Float  = F# Float#
-
-infix 6 :+
--- | Complex numbers.
-data (PrimFloat a) => Complex a = !a :+ !a
-    deriving Eq
-
--- | Coercion to floating point types.
-class FloatConvert a b where
-    -- | Convert to a floating point type.  Conversions from integers and real
-    -- types are provided, as well as conversions between floating point types.
-    -- Conversions between floating point types preserve infinities, negative
-    -- zeros and NaNs.
-    toFloating :: a -> b
-
-instance FloatConvert Double CDouble where
-    toFloating = unsafeCoerce
-
-instance FloatConvert CDouble Double where
-    toFloating = unsafeCoerce
-
-instance FloatConvert Float CFloat where
-    toFloating = unsafeCoerce
-
-instance FloatConvert CFloat Float where
-    toFloating = unsafeCoerce
-
-instance FloatConvert Double Float where
-    toFloating (D# x) = F# (double2Float# x)
-
-instance FloatConvert Float Double where
-    toFloating (F# x) = D# (float2Double# x)
-
-instance FloatConvert Integer Double where
-    toFloating x = D# (doubleFromInteger x)
-
-instance FloatConvert Integer Float where
-    toFloating x = F# (floatFromInteger x)
-
-instance Real a => FloatConvert a Double where
-    toFloating x = D# (num /## denom) where
-        !(D# num)   = toFloating . numerator   . toRational $ x
-        !(D# denom) = toFloating . denominator . toRational $ x
-
-instance Real a => FloatConvert a Float where
-    toFloating x = F# (divideFloat# num denom) where
-        !(F# num)   = toFloating . numerator   . toRational $ x
-        !(F# denom) = toFloating . denominator . toRational $ x
-
-instance FloatConvert a a where
-    toFloating = id
similarity index 69%
rename from Data/Floating/Classes.hs
rename to Data/Floating/Types/Core.hs
index fc1561b..909376c 100644 (file)
@@ -6,14 +6,29 @@
  - There is NO WARRANTY, to the extent permitted by law.
  -}
 
--- | Generic classes for floating point types.  The interface is loosely based
--- off of the C math library.
-module Data.Floating.Classes where
+-- | Core floating point types and classes.
+{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, OverlappingInstances #-}
+{-# LANGUAGE MagicHash #-}
+module Data.Floating.Types.Core where
 
-import Prelude hiding (Floating(..), RealFloat(..), RealFrac(..), Ord(..))
+import Prelude hiding
+    (Double, Float, Ord(..), RealFrac(..), Floating(..), RealFloat(..))
 import Data.Ratio
 import Data.Poset
 
+import GHC.Integer
+import GHC.Prim
+import Foreign.C
+import Unsafe.Coerce
+
+-- | The Double type.  This is expected to be an identical declaration to
+-- the one found in "GHC.Types".  We redefine it in order to replace all its
+-- instances.
+data Double = D# Double#
+
+-- | The Float type.
+data Float  = F# Float#
+
 -- | Classification of floating point values.
 data FPClassification = FPInfinite | FPNaN | FPNormal | FPSubNormal | FPZero
     deriving (Show, Read, Eq, Enum, Bounded)
@@ -143,3 +158,53 @@ class (Roundable a, RealFloat a) => PrimFloat a where
     logb           :: a -> a
     -- | Scales a floating point value by an integral power of the radix.
     scalb          :: Integral b => a -> b -> a
+
+infix 6 :+
+-- | Complex numbers.
+data (PrimFloat a) => Complex a = !a :+ !a
+    deriving Eq
+
+-- | Coercion to floating point types.
+class FloatConvert a b where
+    -- | Convert to a floating point type.  Conversions from integers and real
+    -- types are provided, as well as conversions between floating point types.
+    -- Conversions between floating point types preserve infinities, negative
+    -- zeros and NaNs.
+    toFloating :: a -> b
+
+instance FloatConvert Double CDouble where
+    toFloating = unsafeCoerce
+
+instance FloatConvert CDouble Double where
+    toFloating = unsafeCoerce
+
+instance FloatConvert Float CFloat where
+    toFloating = unsafeCoerce
+
+instance FloatConvert CFloat Float where
+    toFloating = unsafeCoerce
+
+instance FloatConvert Double Float where
+    toFloating (D# x) = F# (double2Float# x)
+
+instance FloatConvert Float Double where
+    toFloating (F# x) = D# (float2Double# x)
+
+instance FloatConvert Integer Double where
+    toFloating x = D# (doubleFromInteger x)
+
+instance FloatConvert Integer Float where
+    toFloating x = F# (floatFromInteger x)
+
+instance Real a => FloatConvert a Double where
+    toFloating x = D# (num /## denom) where
+        !(D# num)   = toFloating . numerator   . toRational $ x
+        !(D# denom) = toFloating . denominator . toRational $ x
+
+instance Real a => FloatConvert a Float where
+    toFloating x = F# (divideFloat# num denom) where
+        !(F# num)   = toFloating . numerator   . toRational $ x
+        !(F# denom) = toFloating . denominator . toRational $ x
+
+instance FloatConvert a a where
+    toFloating = id
index 7da20c5..daf55c4 100644 (file)
@@ -29,9 +29,8 @@ import Foreign
 import Foreign.C
 import System.IO.Unsafe
 
-import Data.Floating.Types
+import Data.Floating.Types.Core
 import Data.Floating.Helpers
-import Data.Floating.Classes
 import Data.Floating.CMath
 
 foreign import ccall unsafe "double_signum"
index 42471a7..d6d9f8f 100644 (file)
@@ -28,9 +28,8 @@ import Foreign
 import Foreign.C
 import System.IO.Unsafe
 
-import Data.Floating.Types
+import Data.Floating.Types.Core
 import Data.Floating.Helpers
-import Data.Floating.Classes
 import Data.Floating.CMath
 
 foreign import ccall unsafe "float_signum"
index 9c9609b..a25c7fe 100644 (file)
@@ -76,8 +76,7 @@ Library
     Exposed-Modules:
         Data.Floating.CMath,
         Data.Floating.CMath.Complex,
-        Data.Floating.Classes,
-        Data.Floating.Types,
+        Data.Floating.Types.Core,
         Data.Floating.Types.Double,
         Data.Floating.Types.Float,
         Data.Floating.Prelude,